Próbuję napisać przypadek testowy przy użyciu nowego testu interfejsu użytkownika dostępnego w Xcode 7 beta 2. Aplikacja ma ekran logowania, w którym nawiązuje połączenie z serwerem, aby się zalogować. Z tym wiąże się opóźnienie, ponieważ jest to operacja asynchroniczna.
Czy istnieje sposób na wywołanie mechanizmu opóźnienia lub oczekiwania w XCTestCase przed przejściem do dalszych kroków?
Brak odpowiedniej dokumentacji i przejrzałem pliki nagłówkowe klas. Nie udało się znaleźć nic z tym związanego.
Wszelkie pomysły / sugestie?
ios
ios9
xcode-ui-testing
xcode7-beta2
xctwaiter
Tejas HS
źródło
źródło
NSThread.sleepForTimeInterval(1)
powinien działaćdispatch_after
,dispatch_queue
stuff)Odpowiedzi:
Asynchroniczne testowanie interfejsu użytkownika zostało wprowadzone w Xcode 7 Beta 4. Aby czekać na etykietę z tekstem „Witaj, świecie!” Aby się pojawić, możesz wykonać następujące czynności:
Więcej szczegółów na temat testowania interfejsu użytkownika można znaleźć na moim blogu.
źródło
waitForExpectationsWithTimeout
automatycznie nie przejdzie testu, co jest dość niefortunne.app.launch()
Wydaje się po prostu wznowienie aplikację. Czy to konieczne?Dodatkowo możesz po prostu spać:
Ponieważ testy UITest działają w innym procesie, działa to. Nie wiem, jak to jest zalecane, ale działa.
źródło
usleep
iOS 11 / Xcode 9
Jest to świetny zamiennik wszystkich niestandardowych implementacji na tej stronie!
Zapoznaj się z moją odpowiedzią tutaj: https://stackoverflow.com/a/48937714/971329 . Tam opisuję alternatywę oczekiwania na żądania, co znacznie skróci czas działania testów!
źródło
XCTestCase
i działa jak urok. Nie rozumiem, dlaczego takie podejściasleep(3)
są tutaj tak wysoko oceniane, ponieważ sztucznie wydłuża czas testowania i nie ma żadnej opcji, gdy rośnie Twój zestaw testowy.Xcode 9 wprowadził nowe sztuczki z XCTWaiter
Przypadek testowy czeka jawnie
Instancja kelnera deleguje się do testowania
Klasa kelnerów zwraca wynik
przykładowe użycie
Przed Xcode 9
Cel C
STOSOWANIE
Szybki
STOSOWANIE
lub
ŹRÓDŁO
źródło
Od Xcode 8.3 możemy korzystać z
XCTWaiter
http://masilotti.com/xctest-waiting/Inną sztuczką jest napisanie
wait
funkcji. Podziękowania należą się Johnowi Sundellowi za pokazanie mi tej funkcjii używaj go jak
źródło
W oparciu o odpowiedź @ Teda użyłem tego rozszerzenia:
Możesz użyć tego w ten sposób
Pozwala także czekać na zniknięcie elementu lub zmianę dowolnej innej właściwości (za pomocą odpowiedniego bloku)
źródło
Edytować:
Właśnie przyszło mi do głowy, że w Xcode 7b4 testy interfejsu użytkownika mają teraz
expectationForPredicate:evaluatedWithObject:handler:
Oryginalny:
Innym sposobem jest obracanie pętli biegu przez określony czas. Naprawdę przydatne tylko, jeśli wiesz, ile czasu (szacowanego) będziesz musiał czekać
Obj-C:
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow: <<time to wait in seconds>>]]
Szybki:
NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: <<time to wait in seconds>>))
Nie jest to szczególnie przydatne, jeśli musisz przetestować niektóre warunki, aby kontynuować test. Aby uruchomić sprawdzanie warunkowe, użyj
while
pętli.źródło
Poniższy kod działa tylko z celem C.
Wystarczy wywołać tę funkcję, jak podano poniżej.
źródło
W moim przypadku
sleep
stworzyłem efekt uboczny, więc użyłemwait
źródło
Zgodnie z interfejsem API dla XCUIElement
.exists
można sprawdzić, czy zapytanie istnieje, czy nie, więc w niektórych przypadkach przydatna może być następująca składnia!Jeśli masz pewność, że Twoje oczekiwania zostaną spełnione, możesz spróbować to uruchomić. Należy zauważyć, że awaria może być lepsza, jeśli oczekiwanie jest zbyt długie, w takim przypadku należy
waitForExpectationsWithTimeout(_,handler:_)
użyć posta @Joe Masilotti.źródło
sen zablokuje wątek
„Żadne przetwarzanie w pętli uruchomieniowej nie występuje, gdy wątek jest zablokowany”.
możesz użyć waitForExistence
źródło
Spowoduje to opóźnienie bez uśpienia wątku lub spowodowania błędu przekroczenia limitu czasu:
Ponieważ oczekiwanie jest odwrócone, upłynie czas oczekiwania.
źródło