2015-09-02 13 views
21

Apple wprowadził w Xcode 7 nowych testów interfejsu użytkownika, ale mam problemy, gdy testy uruchamiają aplikację, zaczyna się od danych, które aplikacja miała wcześniej. Oznacza to, że testy nie mogą być niezależne i mogą na nie wpływać inne testy.Jak zresetować dane aplikacji po każdym teście za pomocą testu Xcode 7 UI?

Nie ma dostępu do domyślnych ustawień użytkownika i innych danych, ponieważ uruchomiona aplikacja nie ma dostępu do pakietu testowanej aplikacji. Skrypty również nie wchodzą w grę, ponieważ można je uruchomić przed lub po testowaniu. I nie ma sposobu, aby wykonać NSTask na iOS, aby uruchomić skrypt przed każdym zestawem testów.

Czy istnieje sposób na zresetowanie danych aplikacji przed każdym zestawem testów?

Odpowiedz

20

Nie w prosty sposób. Ale są pewne rozwiązania.

Urządzenie XCUIApplication może ustawić argumenty wiersza poleceń i zmienne środowiskowe, które mogą wpłynąć na zachowanie aplikacji.

Prostym przykładem pliku main.m:

int main(int argc, char * argv[]) { 
#if DEBUG 
    // Reset all data for UI Testing 
    @autoreleasepool { 
     for (int i = 1; i < argc; ++i) { 
      if (0 == strcmp("--reset-container", argv[i])) { 
       NSArray *folders = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 
       NSFileManager *fm = [[NSFileManager alloc] init]; 
       for (NSString *path in folders) { 
        [fm removeItemAtPath:path error:nil]; 
       } 
       // Also remove documents folder if necessary... 
      } 
     } 
    } 
#endif 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, 
           NSStringFromClass([AppDelegate class])); 
    } 
} 

I -[XCTestCase setUp] dodają:

XCUIApplication *app = [[XCUIApplication alloc] init]; 
app.launchArguments = @[@"--reset-container"]; 
[app launch]; 
+0

Tak, myślałem o tym, ale miałem nadzieję na lepsze rozwiązanie. Na koniec zdecydowałem się rozszerzyć twoje rozwiązanie, aby uwzględnić także inne miejsca i domyślne ustawienia użytkownika. –

+0

@ TomášLinhart: czy możesz udostępnić swoje rozwiązanie? – Peacemoon

+3

Jak mogę użyć tego w Swift? –

6

Jeśli przygotowanie aplikacji dla UITests wewnątrz application:didFinishLaunchingWithOptions: jest ok w przypadku, można wykonać w następujący sposób:

W setUp() metoda twojej klasy testowej rozszerzająca XCTestCase dodaj obserwuj Kod ing:

let application = XCUIApplication() 
application.launchEnvironment = ["UITESTS":"1"] 
application.launch() 

Następnie w application:didFinishLaunchingWithOptions: można sprawdzić flagi przy użyciu następującego kodu:

func application(_ application: UIApplication, 
       didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 

    let env = ProcessInfo.processInfo.environment 
    if let uiTests = env["UITESTS"], uiTests == "1" { 
     // do anything you want 
    } 
    // further set up code 
} 

Oczywiście, jeśli jest to opcja dla Ciebie.

UWAGA: Zamiast ustawiania "1" jako argument dla "UITESTS" flagą, można określić różne wartości dla różnych przypadków testowych - lub nawet metody badań (ale w takim przypadku, należy uruchomić aplikację z metodą badania, nie setUp())

UWAGA 2: Proponuję zawinąć kod dotyczący flagi do bloku #if DEBUG.

4

Muszę zresetować dane aplikacji za pomocą prywatnych nagłówków, aby uzyskać dostęp do odskoczni i aplikacji ustawień.

pierwsze dodałem fazę Uruchom skrypt, aby go usunąć, gdy testy zaczyna:

/usr/bin/xcrun simctl uninstall booted com.mycompany.bundleId

A potem używam rozwiązanie pisałem here aby go usunąć za pomocą skryptu testowego, które działa na tearDown wzywa do resetowania po każdym teście.

Powiązane problemy