Az Objective-C programozási nyelv

Unit teszt

Unit-tesztelési környezet beállítása Objective-C-hez, Xcode alatt.

Unit-Test Target hozzáadása a projekthez

A leírás a következő rendszerminimummal műlödik együtt:


Egy unit tesztet targetet a következő módon tudunk a projekthez adni:

  1. Nyissuk meg a projektet amihez unit teszt targetet szeretnénk adni.
  2. A menüből válasszuk ki a következő menüpontot: File > New > New Target.
  3. Válasszuk a megfelelő unit teszt csomagot a projekt platformjának megfelelően:
    • iOS: Other majd Cocoa Touch Unit Testing Bundle template.
    • Mac: Other majd Cocoa Unit Testing Bundle template.
  4. Next gomb megnyomása.
  5. Adjuk meg a következő unit-test target opcókat:
    1. Product Name: Adjunk nevet a targetnek, ami azonosítja a azt, hogy milyen unit tesztet szeretnénk elvégezni. A nevet lássuk el a Tests utótaggal pl: MyAppLogicTests, MyAppApplicationTests)
    2. Project: Válasszuk ki, hogy mely projektre szertnénk a unit tesztet létrehozni.
  6. Click Finish.

Az új unit teszt target felvétele után a project navigátoron megjelenik egy új mappa, a target nevével, mely tartalmaz ideglenes, üresen legenerált teszt eseteket. Az új target megjelenik az a projekt target listájában is.


Ha az Xcode automatikuan hozza létre a sémákat akkor a Scheme toolbar tartalmaz egy új sémát melynek a neve megegyezik a unit teszt target nevével. Ez az a séma melyet felhasználunk, hogy futassuk azokat a teszt eseteket melyek részei a unit teszt targetnek. A Teszt action-je az új sémának azonosítja a unit teszt targetet és kilistázza azokat a teszt eseteket melyeket a séma futtat.



Lehetőség van extra teszt esetek felvételére is a targeten belul, úgy hogy a teszt esetet az Objctive-C teszt osztályhoz adjuk hozzá.

Logikai Unit Tesztek

Ha hozzáadtunk egy unit teszt targetet a projektünkhöz, akkor a hozzáadott target kész a logikai tesztek készítésére. A következő módon kell beállítani egy unit teszt targetet, hogy logikai tesztet hajtson végre.

  1. A projekt editorban válasszuk ki azt a unit teszt targetet melyet szeretnénk beállítani
  2. A Build Settings panel scope bárján nyomjuk meg az All-t.
  3. A kereső mezőbe írjuk be a bundle loader szavakat majd nyomjuk meg az entert
  4. .
  5. Ha a Bundle Loader build beállítás megjelenik vastag betűvel akkor válasszuk ki és töröljük ki.
  6. A kereső mezőbe írjuk be a test host szavakat majd nyomjuk meg az entert.
  7. Ha a Test Host build beállítás vastag betűvel megjelenik akkor válasszuk ki és töröljuk ki.

Ahhoz, hogy megbizonyosodjunk arról, hogy a unit teszt target helyesen van beállítva a logikai tesztekhez, hajtsuk végre a következő lépéseket:

  1. A Scheme toolbar menüből válasszuk ki a unit teszt sémát és a futási célt. iOS: iOS esetében ez csak simulatior lehet.
  2. Product > Test.
  3. View > Navigators > Issue, hogy megjelenjen az issue navigator. Az issue navigátor az, mely kilisázza az elbukott ideglenes teszteket, jelezve ezzel, hogy a unit teszt target helyesen működik.
  4. Válasszuk ki a View > Navigators > Show Log Navigator menüpontot, hogy megjelenjen a log navigátor.
  5. Az action listben a log navigátorban (bal oldala az ablaknak) válasszuk ki azt a teszt “run”-t melynek a neve megegyezik a unit teszt targettel.

A teszt lefutásának eredménye megjelenik a szerkesztő ablakban.


A teszt futásának kimenete lista elrendezésben jelenik meg. Az, hogy az “All tests” kifejezés nem jelenik meg felül azt jelöli, hogy logikai unit teszteket hajtottunk végre és nem Application tesztet.

Egy logikai teszt futásának kimenete

Test Suite '/Users/ernest/Library/Developer/Xcode/DerivedData/ MyApp-efqrlcykgdvbaocnrardtbvymzbp/Build/Products/Debug-iphonesimulator/ MyAppLogicTests.octest(Tests)' started at 2011-12-02 17:49:51 +0000 Test Suite 'MyAppLogicTests' started at 2011-12-02 17:49:51 +0000 Test Case '-[MyAppLogicTests testExample]' started. /Users/ernest/Desktop/MyApp/MyAppLogicTests/MyAppLogicTests.m:29: error: -[MyAppLogicTests testExample] : Unit tests are not implemented yet in MyAppLogicTests Test Case '-[MyAppLogicTests testExample]' failed (0.000 seconds). Test Suite 'MyAppLogicTests' finished at 2011-12-02 17:49:51 +0000. Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.001) seconds Test Suite '/Users/ernest/Library/Developer/Xcode/DerivedData/ MyApp-efqrlcykgdvbaocnrardtbvymzbp/Build/Products/Debug-iphonesimulator/ MyAppLogicTests.octest(Tests)' finished at 2011-12-02 17:49:51 +0000. Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.003) seconds

Ennél a pontnál eljutottunk oda, hogy a beálított unit teszt target logikai tesztek írására kész

Test Case Method írás

Egy teszt esetet egy test suit-hoz tudunk adni test case method-ok segitségével egy teszt suite osztályokon keresztül. Egy teszt method egy instance típusú methodja a teszt osztálynak melynek a neve test perfixxel kezdődik, nincsen egy paramétere sem és void a visszatérési típusa. Egy teszt eset meghívja a tesztelendő kódrészt (unitot) és reportot készít arról, hogy a hívás megfelelően futott-e le, pl: a megfelelő értékeket adja-e vissza az tesztelt kód vagy a megfelelő exception-t dobta-e. A teszt esetek rengeteg macrot használna, hogy ellenőrízzék a megfelelő elő és utófeltételeket.

Ahhoz, hogy egy test case method elérje a tesztelendő kódrészt melyet tesztelni akarunk, be kell importálni a megfelelő implementációs fileokat, és a hozzájuk tartozó header fileoket is be kell importálni a test suite osztályba.

Egy Test case methods Objective-C-ben írva.

Egy teszt eset felépítése:

- (void)test { ... // Set up, call test-case subject API. ST... // Report pass/fail to testing framework. ... // Tear down. }

Amikor az Xcode futtatja a unit teszteket, mindegyiket egymástól függetlenül futtaja. Éppen ezért minden unit tesztnek elő kell készítenie a változókat, struktúrákat, osztályokat, hogy használni tudják a cél API-t. Bevett szokás, hogy mindegyik unit teszt maga előtt takarít. Pl. létrehozhatunk egy pár függvényt melyek minden teszt eset elött és után meghívódnak: setUp és tearDown. Akárcsak a teszt függvények, ezek is void típusúak és nem kapnak paramétert.

Egy példa a setUp/tearDown függvény párra:

- (void)setUp { test_subject = [[[MyClass alloc] init] retain]; STAssertNotNil(test_subject, @"Could not create test subject."); } - (void)tearDown { [test_subject release]; }

Megjegyzés: Amikor a setUp vagy tearDown elbukik akkor ay Xcode az adott teszt esetben jelezi, melyben a hiba keletkezett.

Unit tesztek futtatása

Ahhoz, hogy futtassuk a unit teszjeinket a Test parancsot kell kiadan azon a sémán mely azonosít egy vagy több unit teszt targeted.

    Unit tesztek futtatása:
  1. A Scheme toolbar menubol valaszuk ki azt a sémat mely tartalmazza a futtatni kívánt teszteket es a futási célt.
  2. Válasszuk ki a következőt: Choose Product > Test.
  3. Ha egy vagy több teszt elbukik akkor azok kilistázásra kerülnek az issue navigátorban. (View > Navigators > Show Issue Navigator).
  4. Hogy megnézzük a tesztek logját válasszuk ki a choose View > Navigators > Show Log Navigator menüpontot és válasszuk ki az első teszt esetet mely megjelenik a log navigátorban.

A log viewer megmutatja a unit teszt futási eredményét: