Testowanie automatyczne iOS za pomocą Xcode Struktura interfejsu użytkownika

⚡ Inteligentne podsumowanie

Testowanie automatyzacji iOS z Xcode rejestruje i odtwarza działania interfejsu użytkownika w testowanej aplikacji, postępując zgodnie z cyklem projektowania, testowania, implementacji i ponownego testowania opartym na testach, aż do momentu, gdy każdy przypadek zostanie zaliczony.

  • 🔘 Cykl TDD: Projektowanie, testowanie, wdrażanie i ponowne testowanie to cztery fazy stosowane w testowaniu aplikacji na iOS.
  • ️ Wymagania wstępne: Komputer Mac z systemem OS X i Xcode Zainstalowane środowisko IDE, środowisko automatyzacji i zestaw SDK dla systemu iOS.
  • ✅ Trasa instrumentów: Narzędzie Automation rejestruje skrypt, wyświetla go w dzienniku skryptów i odtwarza na żądanie.
  • 🧪 Trasa OCUnit: Cel pakietu testów jednostkowych, aktywny schemat, grupa testowa i klasa testowa napisane w Objective-C.
  • ⚠️ Dezaprobata: Narzędzie UIAutomation zostało wycofane w Xcode 8 i usunięto; XCUITest jest wspieranym następcą.
  • 🛠️. Współczesny odpowiednik: Cel pakietu testowego interfejsu użytkownika oraz zapytania XCUIApplication zastępują zarejestrowany skrypt instrumentów.

Testowanie automatyzacji iOS z Xcode Struktura automatyzacji interfejsu użytkownika uruchamiająca nagrany skrypt w aplikacji

Testowanie automatyczne iOS przy użyciu Xcode

Aby zagwarantować jakość swojej aplikacji na system iOS, należy postępować zgodnie z procesem programowania sterowanego testami przedstawionym na poniższym rysunku.

Cykl rozwoju sterowanego testami dla testów automatyzacji systemu iOS, pokazujący fazy projektowania, testowania, wdrażania i ponownego testowania

Rozwój oparty na testach (TDD) to a testowanie model, który jest stosowany do testowania aplikacji iOS i mieści się w szerszej praktyce testy mobilneW tym modelu tester musi wykonać 4 poniższe fazy:

  • Design: Zastanów się, co chcesz przetestować i zaprojektuj przypadki testowe.
  • Test: Uruchom wszystkie testy i sprawdź, czy którykolwiek przypadek testowy się nie powiedzie.
  • Wprowadzić w życie: RevPopraw swój kod i popraw błędy, które spowodowały niepowodzenie testu.
  • Przetestuj ponownie: Jeśli test się nie powiedzie, wróć do projektu. Jeśli wszystkie przypadki testowe zakończą się sukcesem, kod spełnia wszystkie wymagania testowe.

Konfigurowanie Xcode Projekt do testowania interfejsu użytkownika

Aby utworzyć program testowy iOS, potrzebujesz komputera Mac. Na komputerze Mac muszą być już zainstalowane następujące aplikacje:

  • OS X — system operacyjny dla komputerów Mac.
  • Xcode IDE — narzędzie programistyczne dla systemu iOS.
  • Zautomatyzowane ramy testowe — Automatyzacja interfejsu użytkownika, OCUnit i tak dalej.
  • Zestaw SDK iOS 4 lub więcej.

⚠️ Uwaga dotycząca wersji: Powyższe wymagania wstępne opisują zestaw narzędzi z epoki, w której powstały dwa poniższe przewodniki. Na obecnym komputerze Mac: Xcode Zawiera frameworki XCTest i XCUITest w pudełku, a oddzielny instrument UI Automation nie jest już częścią instalacji. Oryginalne kroki zostały zachowane poniżej, ponieważ dokumentują sposób działania frameworka, a jego współczesny odpowiednik opisano poniżej.

Jak utworzyć automatyzację systemu iOS przy użyciu platformy automatyzacji interfejsu użytkownika

Osiem poniższych kroków pozwala na zarejestrowanie skryptu za pomocą narzędzia Automation i jego odtworzenie w testowanej aplikacji.

Krok 1) Uruchom instrumenty

Otwórz XCode -> Otwórz narzędzie programistyczne -> Instrument

Otwieranie instrumentów z Xcode Otwórz menu narzędzi programistycznych

Krok 2) Dodaj instrument automatyzacji

W oknie Instrumenty wybierz instrument Automatyzacja.

Wybieranie instrumentu automatyzacji w selektorze szablonów instrumentów

Aby utworzyć skrypt testowy, należy nagrać scenariusz testowy lub zaprogramujesz go ręcznie.

Krok 3) Naciśnij czerwony przycisk

Instrument jest w trakcie uruchamiania — natychmiast zatrzymaj nagrywanie. Jeśli chcesz rozpocząć nagrywanie, naciśnij czerwony przycisk.

Czerwony przycisk nagrywania na pasku narzędzi Instrumenty, służący do uruchamiania i zatrzymywania nagrywania trace

Krok 4) Utwórz nowy skrypt

W oknie Skrypty kliknij Dodaj > Utwórz, aby utworzyć nowy skrypt.

Menu Dodaj i Utwórz w oknie Skrypty instrumentów dla nowego skryptu automatyzacji

Krok 5) Wybierz cel

Jesteś teraz w TracOkno e. Użyj opcji Wybierz Target rozwijana lista umożliwiająca przejście do wersji debugowania aplikacji.

Dodaj Target rozwijane w Instrumentach Tracokno wskazujące na kompilację debugowania

W tym przypadku próbka Apple'a Proste drążenie w dół Aplikacja jest używana jako aplikacja testowa. Posiada ona interfejs graficzny pokazany poniżej.

Interfejs przykładowej aplikacji SimpleDrillDown używany jako aplikacja testowana

Krok 6) Rozpocznij nagrywanie swojego skryptu

Nagraj swój skrypt, naciskając przycisk nagrywania u góry lub u dołu narzędzia.

Przycisk nagrywania na krawędzi okna instrumentów, który uruchamia przechwytywanie skryptu

Teraz możesz wykonać pewne czynności interfejsu użytkownika w testowanej aplikacji, a Twój skrypt zostanie zarejestrowany.

Krok 7) Zobacz swój skrypt

Aby zobaczyć swój skrypt, naciśnij Trace Dziennik / Dziennik edytora rozwijana lista i przełączenie do widoku dziennika skryptów.

Trace Dziennik i dziennik edytora Lista rozwijana służąca do przełączania się na widok dziennika skryptów

Zobaczysz nagrany skrypt.

Zarejestrowany skrypt automatyzacji interfejsu użytkownika wyświetlany w widoku dziennika skryptów instrumentów

Krok 8) Odtwórz swój scenariusz

Naciśnij przycisk „Odtwórz”. Skrypt zostanie uruchomiony i możesz go zatrzymać po wyświetleniu logów.

Odtwarzanie nagranego skryptu automatyzacji z danymi wyjściowymi dziennika w oknie Instrumenty

⚠️ Uwaga historyczna: Narzędzie automatyzacji używane w tych ośmiu krokach zostało wycofane w Xcode 8 i później usunięto, więc nie występuje już w obecnej wersji Xcode Instalacje. Kroki są tutaj zachowane jako zapis działania frameworka; w przypadku nowych prac skorzystaj z instrukcji XCUITest zamieszczonej niżej na tej stronie.

Jak stworzyć automatyzację iOS przy użyciu frameworka OCUnit

Druga trasa umieszcza testy wewnątrz Xcode samego projektu, a nie wewnątrz Instrumentów.

Krok 1) Rozpoczęcie Xcode IDE, Dodaj cel pakietu testów jednostkowych

Dodawanie celu pakietu testów jednostkowych do istniejącego Xcode projekt

Krok 2) Wpisz nazwę nowego pakietu testów jednostkowych jak pokazano na rysunku powyżej, a następnie kliknij Zakończ.

Krok 3) Uczyń test jednostkowy aktywnym celem

Wybór pakietu testów jednostkowych jako aktywnego celu w Xcode

Krok 4) Dodaj grupę do zajęć testowych

Tworzenie grupy projektowej do przechowywania klas testów jednostkowych iOS

Krok 5) Dodaj klasę testów jednostkowych

Dodawanie nowego pliku klasy testu jednostkowego w grupie testowej w Xcode

Krok 6) Teraz rozpocznij wdrażanie

Pusta klasa testu jednostkowego w Xcode edytor gotowy do wdrożenia testowego

OCUnit wykorzystuje język Objective-C do tworzenia programu testowego, więc programista musi znać ten język. Xcode wersje dostarczane testów jednostkowych zamiast tego przez XCTest, który obsługuje zarówno Objective-C, jak i Swift, ale struktura docelowa i klasowa przedstawiona w tych sześciu krokach pozostaje niezmieniona.

UIAutomation kontra XCUITest: Co się zmieniło

Ponieważ oba przedstawione powyżej frameworki należą do wcześniejszej generacji zestawu narzędzi Apple, warto precyzyjnie określić, czym je zastąpiono i dlaczego.

WYGLĄD Automatyzacja interfejsu użytkownika (instrumenty) XCUITest
Status Przestarzałe w Xcode 8 i usunięto z późniejszych wydań Obsługiwana przez Apple struktura testowania interfejsu użytkownika
Gdzie odbywają się testy Skrypty wewnątrz instrumentów tracdokument elektroniczny Cel pakietu testowania interfejsu użytkownika w Xcode projekt
Wybierz język JAVASCRIPT Swift lub Objective-C
Tester Narzędzie automatyzacji XCTest, ten sam program uruchamiający testy jednostkowe
Ciągła integracja Niezręcznie — prowadzony przez Instrumenty Działa z poziomu wiersza poleceń wraz z testami jednostkowymi
Nagranie Przycisk nagrywania na pasku narzędzi instrumentów Przycisk nagrywania w Xcode edytor, który emituje Swift

Praktyczną konsekwencją jest to, że pakiet XCUITest to zwykły kod źródłowy projektu. Jest on sprawdzany, wersjonowany i wykonywany jak reszta bazy kodu, co jest głównym powodem, dla którego…tracModel zniknął.

Jak napisać test interfejsu użytkownika iOS za pomocą XCUITest

Współczesny odpowiednik ośmiu kroków Instruments jest krótki. Poniższa struktura odzwierciedla tę samą ideę nagrywania i odtwarzania, ale wyjściem jest plik źródłowy, a nie trace.

  1. Dodaj cel. In Xcode wybierz Plik > Nowy > Target i wybierz szablon Pakietu testowania interfejsu użytkownika lub zaznacz opcję uwzględnienia testów podczas tworzenia nowego projektu.
  2. Otwórz wygenerowaną klasę testową. Xcode tworzy podklasę XCTestCase z pustymi metodami konfiguracji i testu.
  3. Uruchom testowaną aplikację. Utwórz instancję XCUIApplication i wywołaj na niej launch, co spowoduje uruchomienie aplikacji w osobnym procesie.
  4. Zapytaj i działaj. Możesz dotrzeć do elementów za pomocą zapytań o elementy — przycisków, tabel, tekstów statycznych — i wywołać je za pomocą funkcji tap, typeText lub przesuń palcem.
  5. Zapewniać. Użyj XCTAssert, aby sprawdzić, czy oczekiwany element istnieje po wykonaniu akcji.
  6. Biegać. Wykonaj test z Xcode nawigatora testów lub z wiersza poleceń, aby ten sam pakiet działał w ciągłej integracji.

Minimalny test wygląda następująco:

import XCTest

final class AppUITests: XCTestCase {

    func testTappingFirstRowShowsDetail() {
        let app = XCUIApplication()
        app.launch()

        // act on the first row of the list
        app.tables.cells.element(boundBy: 0).tap()

        // verify that the next screen appeared
        XCTAssertTrue(app.staticTexts.firstMatch.waitForExistence(timeout: 5))
    }
}

Rejestrator nadal istnieje: umieszczenie kursora w metodzie testowej i naciśnięcie przycisku nagrywania w edytorze automatycznie generuje te zapytania, co jest bezpośrednim następcą kroku 6 powyżej. Szersze zasady testowanie automatyzacji obowiązują bez zmian.

Przykład automatyzacji interfejsu użytkownika Code

W tym artykule znajdziesz przykłady kodu źródłowego. Pomogą Ci one szybciej i lepiej zrozumieć samouczek.

Przykład automatyzacji interfejsu użytkownika — skrypt testowy dla demonstracji UI Automation.

FAQ

Nie. Xcode a symulatory iOS działają tylko na macOS, dlatego wymagany jest komputer Mac, lokalnie lub jako hostowana maszyna do kompilacji. Farmy urządzeń w chmurze i dostawcy hostowanej CI istnieją właśnie po to, aby zespoły bez komputerów Mac mogły nadal uruchamiać pakiet.

Modele uczenia maszynowego sugerują zapytania o elementy zastępcze w przypadku zmiany ekranu, grupują niestabilne awarie według ich pierwotnej przyczyny i klasyfikują nieudane uruchomienia jako rzeczywiste regresje. Ma to znaczenie w przypadku zestawów interfejsów użytkownika, gdzie drobne zmiany w układzie mogłyby uszkodzić wiele selektorów jednocześnie.

Dobrze radzi sobie z powtarzalnymi elementami — rusztowaniem klas testowych, argumentami uruchamiania, wrapperami obiektów stron i szablonami asercji. Identyfikatory elementów nadal muszą być zgodne z rzeczywistą aplikacją, więc każde wygenerowane zapytanie wymaga weryfikacji w bieżącej kompilacji, zanim zostanie uznane za zaufane.

Appium steruje systemem iOS za pomocą sterownika XCUITest, który zastąpił starszy sterownik UIAutomation. Zaletą jest jeden wieloplatformowy język testowy dla systemu iOS i Android; kompromisem jest dodatkowa warstwa pomiędzy testem a własnym programem uruchamiającym firmy Apple.

Test jednostkowy jest uruchamiany wewnątrz procesu aplikacji i wywołuje kod bezpośrednio. Test interfejsu użytkownika uruchamia aplikację jako oddzielny proces i wchodzi w interakcję tylko za pośrednictwem interfejsu, więc jest wolniejszy, ale weryfikuje rzeczywiste doświadczenia użytkownika.

Symulatory są szybsze i skuteczniejsze w przypadku większości przepływów funkcjonalnych w potoku. Do obsługi kamery, biometrii, powiadomień push, wydajności i wszystkiego, co ma kontakt z czujnikami sprzętowymi, potrzebne są rzeczywiste urządzenia, dlatego większość zespołów uruchamia oba te rozwiązania w różnych punktach cyklu.

Każdy test ponownie uruchamia aplikację i czeka na animacje. Stabilność poprawia się, gdy ustawiasz identyfikatory dostępności zamiast dopasowywać je do etykiet, czekasz na istnienie elementu zamiast na jego uśpienie.ping, resetuj stan pomiędzy testami i skupiaj każdy przypadek na jednej podróży.

Nie bezpośrednio, ponieważ języki i modele elementów różnią się. Zazwyczaj stare skrypty służą jako dokumentacja zamierzonego pokrycia, a następnie każdy scenariusz jest przepisywany jako przypadek testowy XCUITest, zaczynając od ścieżek, które najczęściej kończą się niepowodzeniem w środowisku produkcyjnym.

Podsumuj ten post następująco: