2015-08-02 6 views
15

To jest mój prosty przypadek testowy:Jak zaimportować mój moduł aplikacji do pliku MyAppUITests?

import XCTest 
@testable import MyApp //it doesn't work 

z tego powodu:

enter image description here

class TabBarControllerTests: XCTestCase { 

    override func setUp() { 
     super.setUp() 

     let defaults = NSUserDefaults.standardUserDefaults() 
     defaults.setObject([], forKey: DBTabBarOrderedIndexesKey) //key is undefined, because of lack of my app module 
     defaults.synchronize() 

     continueAfterFailure = false 
     XCUIApplication().launch() 
    } 

    func testIsOrderOfTabsSaved() { 

     XCUIApplication().tabBars.buttons["Catering"].tap() 
     //what next? 
    } 
} 

Raz dotknij UITabBarItem zmienić wartość DBAppSettings.mode, więc tutaj chciałbym mieć dostęp do mojej właściwości DBAppSettings.mode, aby sprawdzić, czy rzeczywiście została zmieniona.

Zauważyłem, że jest jedna dziwna rzecz, kiedy buduję swoją aplikację i sprawdzam, co zostało zbudowane, tam nie jest kompilacją dla mojego celu UITest. Czy to ważne?

enter image description here

Odpowiedz

5

Jest to odpowiedź firmy Apple:

testy UI wykonać inaczej testów jednostkowych - Testy jednostkowe uruchomić wewnątrz procesu aplikacji, aby mogli uzyskać dostęp do kodu aplikacji. Testy interfejsu użytkownika są wykonywane w oddzielnym procesie, poza aplikacją, dzięki czemu mogą symulować interakcje użytkownika z aplikacją. Nie oczekuje się, że będzie można uzyskać dostęp do klasy aplikacji z testu interfejsu użytkownika.

0

Od Jabłko uniemożliwia dostęp do głównego aplikacji z testów UI, można by pomyśleć o reorganizacji struktury aplikacji do przechowywania istotnych danych, który wymaga sprawdzenia w miejscu dostępnym dla testów UI.

Można rozważyć przenoszenie definicji i danych z głównej klasy aplikacji do oddzielnej klasy, która może zostać załadowana przez środowisko testowe.

+0

To nie jest dobry pomysł, ponieważ potrzebuję dostępu do mojej aplikacji, a nie do niektórych zajęć. W tym przypadku istnieje prosty przypadek z 'kluczem', ale często potrzebuję dostępu do niektórych singletonów. –

+0

Zazwyczaj umieszczam singletony w ich własnych klasach zewnętrznych względem współużytkowanej instancji aplikacji. Czy to działa w twoim celu? – rholmes

+1

będzie działać, ale obiekty w ramach tych singletonów są kolejnymi obiektami z mojej klasy, więc w zasadzie musiałbym dołączyć do celu testowego każdy plik z mojej aplikacji docelowej :-) nie oczekuje się ... –

1

Każdy obiekt, do którego potrzebujesz dostępu w testach interfejsu użytkownika musi być częścią celu testu interfejsu użytkownika. Obejmuje to zależności obiektów. To śliskie zbocze i raczej bałagan.

1

Zamiast sprawdzać swoje testy na temat swojej aplikacji, spróbuj ją obrócić i poinformuj ją, że jest testowana. Jednym ze sposobów jest wykorzystanie właściwości launchArguments:

app = XCUIApplication() 
    app.launchArguments.append("TestMode") 
    app.launch() 

Następnie w aplikacji:

if NSProcessInfo.processInfo().arguments.contains("TestMode") { 
     // I am running in test mode 
    } 

W twoim przypadku aplikacja może następnie ustawić NSUserDefaults odpowiednio.

0

Rozwiązałem problem z niedostępnym symbolem, wyciągając niektóre rzeczy z mojej aplikacji docelowej do dwóch frameworków (model i model widoku), które następnie mogę zaimportować do moich testów interfejsu użytkownika.

Jeśli chodzi o dostęp do faktycznej pamięci pliku wykonywalnego, nie można, ale można przetestować, czy rzeczy, które powinny pojawić się na ekranie gdzieś w tym trybie. Używam tego potwierdzenia do np. sprawdź istnienie komórki widoku tabeli:

XCTAssertTrue(tables.cells.staticTexts["Cell title I expect to exist"].waitForExistence(timeout: 1)) 

Ponieważ możesz korzystać z ułatwień dostępu, możesz uzyskać dostęp do całkiem przyzwoitej ilości rzeczy w ten sposób. Przypuszczam, że możesz dodać niewidzialną etykietę ze zrzutem pamięci aplikacji - tylko w trybie testowym!

Też używam argumentów uruchamiania, aby skonfigurować moją aplikację do testów interfejsu użytkownika, jak Michael zasugerował: https://stackoverflow.com/a/34469136/4789448.