2013-08-08 12 views
30

Niektóre tła:Nie uruchomić symulator, gdy uruchomiony unittests

Mam aplikacji iOS z celem skonfigurowany do uruchomienia unitTests. I używam narzędzia JNK-y do automatyzacji kompilacji na moim MacBooku, które automatycznie buduje tę aplikację i uruchamia wszystkie testy (przy użyciu narzędzia xcodebuild z wiersza poleceń).

Wszystko działało dobrze z Xcode 4. To narzędzie do automatyzacji kompilacji działało pod innym użytkownikiem i przeprowadzało wszystkie te testy.

Niedawno przełączyłem się na Xcode 5 i zaczęło się to nie udać, ponieważ nie można uruchomić symulatora.

Problem

Mam UnitTests systemu, który jest skonfigurowany do uruchamiania testów (testy logiczne). AI uruchomić te testy przy użyciu jednej z dwóch metod:

  • polecenia U w Xcode

  • lub wiersz poleceń „/ usr/bin/xcodebuild -schemat UnitTests -sdk iphonesimulator -konfigurację Zwolnij czysty build TEST_AFTER_BUILD = TAK "

W obu przypadkach próbuje uruchomić symulator. Jednak według mojego zrozumienia to nie jest potrzebne. W każdym razie działa na topowym X86 i nie wygląda na to, że na Symulatorze zainstalowane są jakieś aplikacje.

Czy istnieje sposób na pozbycie się tego brzydkiego początku symulatora (ponieważ łamie on moją automatyzację kompilacji)?

Update 1

Wydaje się znaleźć bardzo podobne pytanie, ale nie można się go pracy: Run logic tests in Xcode 4 without launching the simulator

Aktualizacja 2

znalazłem bardzo istotne i interesujące pytanie/odpowiedź : Apple CI/Xcode Service and Jenkins

+0

To pytanie również może pomóc. Kroki powinny być prawie takie same dla aplikacji na iOS. http://stackoverflow.com/questions/19219706/xcode-5-unit-testing-starts-my-app –

+0

@CleverError: Dzięki. Spojrzę na to. –

+0

Dlaczego nie chcesz uruchomić symulatora? – quellish

Odpowiedz

12

Można utworzyć test jednostki Mac OSX zamiast n Test urządzenia iOS. Wymaga to jednak, aby nie uwzględniać żadnych specyficznych bibliotek systemu iOS w testach jednostkowych. Można to zrobić za pomocą poniższego:

  1. Wybierz projekt -> spadek docelowej w dół -> „Dodaj element docelowy ...”
  2. Wybierz „Mac OS X” -> „Inne” -> „Kakao Jednostka Testowanie Bundle”
  3. Utwórz pakiet badań, jak będzie to normalny projekt

teraz można dodać źródła do testów jednostkowych i uruchomić go jak test iOS bez uruchamiania symulatora.

+2

To jest kierunek, w którym teraz się poruszam. Jednak iOS i OS X nie są dokładnie tymi samymi systemami operacyjnymi (szczególnie biorąc pod uwagę wszystkie różnice między strukturami). –

13

Zadałem to samo pytanie inżynierom Apple. Niestety nie wydaje się, abyś mógł to osiągnąć i pozostać z iOS w tym samym czasie. Istnieje kilka sztuczek, które możesz zrobić, aby sprawdzić, czy testujesz. Możesz umieścić ten fragment kodu w swoim AppDelegate.h lub jakaś inna klasa globalny powiedzieć nie załadować viewcontroller korzeniowy i uniknąć rzeczy wierdo ui od zgorszenie testy jednostkowe:

static BOOL isTesting() { 
    BOOL isTesting = !isEmpty([[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]); 
    return isTesting; 
} 

Ja również miałem inżynier jabłko zweryfikować ten jest uzasadniony check. I dać kredytu w przypadku gdy kredyt jest spowodowane, to jest od: Programmatically determine current target (run or test) in iOS project

EDIT: miałem również sukcesy z tym i jest to trochę bardziej prosta:

static BOOL isTesting() { 
    return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"]; 
} 
+0

Zgaduję, że chciałbyś zrobić: return isTesting; W przeciwieństwie do "return NO;" –

+0

Przepraszam. Wkleiłem kod z projektu i nie zwracałem na niego uwagi! – rfrittelli

+0

To interesujące rozwiązanie! – LightningStryk

16

Korzystanie Xcode 7 i xCtool.

xctool jest zdolny do wykonywania testów jednostkowych bez symulatora.

Aby uzyskać tej pracy,

1. Zaktualizuj ustawienia docelowe, aby działały bez aplikacji hosta.

Wybierz swój projekt -> następnie cel testowy -> Ustaw aplikację hosta na none.

enter image description here

2. Instalacja xctool, jeśli go nie masz.

brew install xctool 

3. przeprowadzenia testów za pomocą zacisku z xctool.

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator 
+1

Możesz napotkać błędy linkera z klasami, które nie są niedostępne w pakiecie testowym, rozwiązać je, aby to działało. – rustylepord

+0

To jest dziwne. Dokumentacja xctool stwierdza [Jeśli używasz xctool w ciągłej integracji, konto użytkownika wywołującego xctool musi mieć aktywny kontekst GUI. Jeśli nie, symulator nie rozpocznie się od tajemniczych ostrzeżeń] (https://github.com/facebook/xctool). –

1

osx target test może stać się ogromny kłopot, bo trzeba zarządzać sobą, które źródło plików do uwzględnienia. Umieszczenie pliku @testable import YourAppName na wierzchu plików XCTest jest znacznie wygodniejsze. Zapobiegaj więc uruchomieniu aplikacji w przypadku uruchomienia XCTest.

W swojej AppDelegate umieścić: (Swift 3 roztwór)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
{ 
    if ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil { 
     return false 
    } 

... 

To przyzwyczajenie zapobiec symulator od uruchomienia, ale pozwoli zaoszczędzić sporo czasu.

+0

Nie rozumiem, jeśli to nie powstrzyma symulatora przed uruchomieniem, jak jest to odpowiedź na pytanie? – smileBot

0

Obejście:

App nadal uruchomi ale może #if zdefiniowanie tego, czego nie chcą działać.

Podejście:

  1. utworzyć konfigurację zwyczaj budowania nazwie Test przez powielenie Debug (projekt> Informacje> utworzyć nową konfigurację)
  2. W Build Settings>Active Compilation Conditions dla Test dodać TESTING
  3. Edytuj Schemat> Informacje> Utwórz konfigurację, ustaw konfigurację kompilacji jako test
  4. Użyj #if !TESTING#endif wokół c nie chcesz wykonywać podczas testowania.

szkieletowe:

Jeśli wbudowane szkieletowe utworzyć taką samą konfigurację budować w ramach tak, że binarny ramy jest prawidłowo połączone.

Powiązane problemy