Úvod do testování iOS pomocí automatizace uživatelského rozhraní

Dub 17, 2021
admin

Představte si, že byste mohli psát skripty, které by automaticky komunikovaly s vaší aplikací iOS, a ověřovat jejich výsledky. S nástrojem UI Automation můžete. UI Automation je nástroj poskytovaný společností Apple, který umožňuje provádět vyšší úroveň testování aplikace iOS, než jaká je dosažitelná pomocí XCTestu.

1. UI Automation je nástroj poskytovaný společností Apple. White Box versus Black Box Testing

Možná jste už slyšeli srovnání white box testing versus black box testing s ohledem na to, jak lze testovat software. Pokud tyto pojmy neznáte, vysvětlím vám, jak fungují.

Testování bílé skříňky

Představte si, že uvnitř skříňky běží kus softwaru. Pomocí testování bílé krabice můžete nahlédnout dovnitř krabice a podívat se na všechny drobné části fungování softwaru a poté učinit kvalifikované rozhodnutí, jak software otestovat. Z testů, které napíšete, můžete mít také háčky do softwaru na hlubší úrovni.

Testování jednotek je testování bílé skříňky. Při psaní unit testů má tester jemný přístup k testovanému kódu. Tester může skutečně psát testy, které využívají testovaný software na úrovni metod nebo jednotek.

Ve vývoji softwaru pro iOS používáme k tomuto typu testování framework XCTest. Podívejte se na další tutoriál, který jsem napsal o začátcích práce s XCTestem.

Testování černé skříňky

Při testování černé skříňky je skříňka neprůhledná. Tester nevidí dovnitř krabice. Tester nemá přístup a nezná implementaci kódové báze, aby mohl psát testy. Místo toho je tester nucen používat aplikaci stejně jako koncový uživatel tím, že interaguje s aplikací a čeká na její odezvu a ověřuje výsledky.

Existují nejméně dva způsoby provádění tohoto typu testování.

  • Tester, který opakovaně a ručně provádí řadu předem definovaných kroků a vizuálně ověřuje výsledky.
  • Použití specializovaných nástrojů pro testování aplikace s rozhraním API, které se chová podobně jako člověk při interakci s aplikací.

Při vývoji aplikací pro systém iOS poskytuje společnost Apple nástroj nazvaný UI Automation, který slouží k provádění testování černé skříňky.

2. Testování černé skříňky:

Testování černé skříňky se provádí pomocí nástroje UI Automation. Co je UI Automation?

UI Automation je nástroj, který společnost Apple poskytuje a spravuje pro automatizované testování aplikací iOS na vyšší úrovni. Testy se píší v jazyce JavaScript a dodržují rozhraní API definované společností Apple.

Psaní testů si můžete usnadnit tím, že se budete spoléhat na označení přístupnosti prvků uživatelského rozhraní v aplikaci. Nemějte však obavy, pokud je nemáte definované, jsou k dispozici alternativy.

UI Automation API postrádá typický formát pro psaní testů založený na xUnit. Jedním z rozdílů oproti jednotkovým testům je, že tester musí ručně zaznamenávat úspěchy a neúspěchy. Testy UI Automation se spouštějí z nástroje Automation v rámci nástroje Instruments, který je dodáván s vývojářskými nástroji společnosti Apple. Testy lze spustit v simulátoru iOS nebo na fyzickém zařízení.

3. Psaní testů UI Automation

Krok 1: Otevřete ukázkový projekt

Ukázkový projekt použitý v předchozím návodu na testování iOS jsem aktualizoval o některé další prvky uživatelského rozhraní, které poskytují užitečné háčky pro přidání testů UI Automation. Stáhněte si projekt z GitHubu. Otevřete projekt a spusťte aplikaci, abyste se ujistili, že vše funguje podle očekávání. Měli byste vidět uživatelské rozhraní podobné tomu, které je zobrazeno níže.

Než začneme psát nějaké testy, neváhejte si ukázkovou aplikaci vyzkoušet, abyste se seznámili s její funkčností. Jako uživatel můžete zadat text do textového pole a klepnutím na tlačítko zobrazit na obrazovce popisek, který zobrazí obrácený, zadaný řetězec.

Krok 2: Vytvoření testu UI Automation

Teď, když jste se seznámili s ukázkovou aplikací, je čas přidat test UI Automation. UI Automation je nástroj, který najdete v nástroji Instruments. Chcete-li spustit ukázkovou aplikaci v nástroji Instruments, vyberte v nabídce Xcode profil Product >. Ze seznamu nástrojů vyberte Automation.

Otevře se hlavní okno Instruments s jediným nástrojem připraveným ke spuštění, nástrojem Automation (nástroj Automation provádí testovací případy UI Automation). V dolní polovině okna se také zobrazí oblast, která vypadá jako textový editor. Jedná se o editor skriptů. Zde budete psát své testy UI Automation. Pro tento první test postupujte podle následujících pokynů a přidávejte jednotlivé řádky do skriptu v editoru skriptů:

Začněte uložením odkazu na textové pole do proměnné.

var inputField = target.frontMostApp().mainWindow().textFields();

Nastavte hodnotu textového pole.

inputField.setValue("hi");

Ověřte, zda byla hodnota úspěšně nastavena, a pokud ano, proveďte test. Pokud nebyla, test nevyhoví.

Ačkoli je tento test poměrně triviální, má svou hodnotu. Právě jsme napsali test, který testuje přítomnost textového pole při spuštění aplikace a který testuje, zda lze jako hodnotu textového pole nastavit náhodný řetězec. Pokud mi nevěříte, odstraňte textové pole ze storyboardu a spusťte test. Uvidíte, že selže.

Tento test demonstruje tři důležité části psaní automatizačních testů uživatelského rozhraní. Za prvé ukazuje, jak přistupovat k jednoduchému prvku uživatelského rozhraní, textovému poli. Konkrétně přistupujeme ke slovníku všech textových polí v základním zobrazení aplikace prostřednictvím target.frontMostApp().mainWindow().textFields() a textové pole, které nás zajímá, pak najdeme vyhledáním pole s klíčem Input Field. Tento klíč je vlastně označení přístupnosti textového pole. V tomto případě je definován ve storyboardu. Štítek přístupnosti můžeme nastavit také v kódu pomocí vlastnosti accessibilityLabel na NSObject.

Při práci s aplikací UI Automation se běžně používá přístup k hlavnímu oknu aplikace, nejpřednější aplikaci a cíli. Ukážu vám, jak to udělat jednodušeji a méně zdlouhavě později v tomto tutoriálu.

Druhé, toto vám ukazuje, že můžete interagovat s prvky uživatelského rozhraní na obrazovce. V tomto případě nastavujeme hodnotu textového pole, čímž napodobujeme interakci uživatele s aplikací zadáváním textu do textového pole.

A za třetí, příklad také ukazuje techniku ověřování toho, co se v aplikaci děje. Pokud je hodnota úspěšně nastavena, test proběhne úspěšně. Pokud se hodnota nenastaví, test selže.

Krok 3: Ukládání testů

Psaní testů v editoru skriptů je sice pohodlné, ale rychle se stává těžkopádným a náročným na údržbu. Pokud nástroj Instruments ukončíte, všechny neuložené změny se zahodí. Napsané testy musíme uložit. Jednoduše zkopírujte a vložte test do nového dokumentu v oblíbeném textovém editoru a uložte jej. Testy vytvořené v tomto návodu najdete ve vzorovém projektu v části Jumblify/JumblifyTests/AutomationTests.js.

Chcete-li test spustit, vyberte prostřední záložku v panelu vpravo vedle editoru skriptů a vyberte možnost Přidat > Import.

Budete vyzváni k výběru skriptu, který chcete importovat. Přejděte na uložený skript a importujte jej. Skript můžete ještě změnit v editoru skriptů. Veškeré změny se automaticky uloží do vytvořeného externího souboru.

Krok 4: Klepnutí na tlačítko

Aktualizujme náš test, abychom otestovali interakci s tlačítkem. Náš test již přidává text do textového pole, takže stačí přidat kód pro klepnutí na tlačítko. Nejprve se zamyslíme nad tím, jak najít tlačítko v zobrazení, aby na něj bylo možné klepnout. Existují nejméně tři způsoby, jak toho dosáhnout, a každý přístup má své kompromisy.

Přístup 1

Můžeme programově klepnout na souřadnici (X, Y) na obrazovce. Uděláme to pomocí následujícího řádku kódu:

target.tap({x: 8.00, y: 50.00});

Samozřejmě netuším, jestli jsou to vůbec souřadnice tlačítka na obrazovce, a nebudu se tím zabývat, protože tento přístup není pro tuto práci vhodným nástrojem. Zmiňuji se o něm jen proto, abyste věděli, že existuje. Použití metody tap na target pro klepnutí na tlačítko je náchylné k chybám, protože toto tlačítko nemusí být vždy na této konkrétní souřadnici.

Přístup 2

Tlačítko je také možné najít prohledáním pole tlačítek hlavního okna, podobně jako jsme přistupovali k textovému poli v prvním testu. Místo přímého přístupu k tlačítku pomocí klíče můžeme načíst pole tlačítek hlavního okna a natvrdo zadat index pole, abychom získali odkaz na tlačítko.

target.frontMostApp().mainWindow().buttons().tap();

Tento přístup je o něco lepší. Nekódujeme natvrdo souřadnici, ale natvrdo kódujeme index pole, abychom našli tlačítko. Kdybychom náhodou na stránku přidali další tlačítko, mohlo by to náhodou tento test porušit.

Přístup 3

Tím se dostávám ke třetímu způsobu vyhledání tlačítka na stránce, a to pomocí štítků přístupnosti. Pomocí štítku přístupnosti můžeme k tlačítku přistupovat přímo, stejně jako bychom našli objekt ve slovníku pomocí klíče.

target.frontMostApp().mainWindow().buttons().tap();

Pokud však do skriptu přidáte výše uvedený řádek a spustíte jej, zobrazí se chyba.

To proto, že jsme pro tlačítko ještě nedefinovali štítek přístupnosti. Chcete-li to udělat, přejděte do Xcode a otevřete storyboard projektu. Najděte v zobrazení tlačítko a vpravo otevřete inspektor identity (View > Utilities > Identity Inspector). Ujistěte se, že je povoleno zpřístupnění, a nastavte štítek tlačítka na hodnotu Jumblify Button.

Chcete-li znovu spustit test, musíte aplikaci spustit z Xcode výběrem položky Product > Run a poté aplikaci znovu profilovat výběrem položky Product > Profile. Tím se testy spustí a každý z nich by nyní měl projít.

Krok 5: Ověření přeházeného řetězce

Jak jsem se již zmínil, naše aplikace přijímá jako vstup textový řetězec, a když uživatel klepne na tlačítko, zobrazí obrácený řetězec. Musíme přidat ještě jeden test, abychom ověřili, že vstupní řetězec je správně převrácený. Abychom ověřili, že je UILabel vyplněn správným řetězcem, musíme zjistit, jak se na UILabel odkázat a ověřit řetězec, který zobrazí. To je častý problém při psaní automatizačních testů, tj. přijít na to, jak se odkázat na prvek v aplikaci, abychom na něm mohli provést tvrzení.

Téměř na každém objektu v rozhraní API pro automatizaci uživatelského rozhraní je metoda logElementTree. Tato metoda zaznamenává vnořené prvky daného prvku. To je velmi užitečné pro pochopení hierarchie prvků v aplikaci a pomáhá to zjistit, jak se zaměřit na konkrétní prvek.

Podívejme se, jak to funguje, na protokolování stromu prvků hlavního okna. Podívejte se na následující řádek kódu:

target.frontMostApp().mainWindow().logElementTree();

Přidáním tohoto řádku do testovacího skriptu získáme následující výstup:

Jak vidíte, existuje UIAStaticText podelement UIAWindow a můžete také vidět, že má název ih, což je shodou okolností také obrácený řetězec, který potřebujeme ověřit. Nyní k dokončení našeho testu stačí přidat kód pro přístup k tomuto elementu a ověřit, zda je přítomen.

Proč potřebujeme ověřit pouze to, zda je přítomen element UIAStaticText? Protože název prvku je převrácený řetězec vstupního řetězce, ověření jeho přítomnosti potvrzuje, že řetězec byl správně převrácen. Pokud prvek neexistuje, když se na něj odkazujeme pomocí názvu – obráceného řetězce, znamená to, že řetězec nebyl správně obrácen.

4. V případě, že prvek neexistuje, je třeba jej ověřit. Poškrábání povrchu

Existuje mnoho dalších způsobů, jak může koncový uživatel při používání vaší aplikace komunikovat se zařízením iOS. To znamená, že existuje mnoho dalších způsobů, jak můžete pomocí automatizace uživatelského rozhraní tyto interakce simulovat. Než abych se pokoušel zachytit vyčerpávající seznam těchto interakcí, raději vás odkážu na referenční dokumentaci UI Automation.

Pro každý typ objektu, se kterým můžete interagovat, si můžete zobrazit seznam metod dostupných pro tento objekt. Některé metody slouží k získání atributů o objektu, zatímco jiné slouží k simulaci dotykové interakce, například flickInsideWithOptions na UIAWindow.

Záznam relace

Pokud se budete pokoušet testovat stále složitější aplikace pomocí UI Automation, zjistíte, že je někdy docela únavné opakovaně používat logElementTree, abyste našli hledaný prvek. Únavné a složité se to stává také u aplikací se složitou hierarchií zobrazení nebo navigací. V těchto případech můžete použít jinou funkci nástroje Instruments a zaznamenat sadu uživatelských interakcí. Ještě zajímavější je, že nástroj Instruments generuje kód JavaScriptu pro automatizaci uživatelského rozhraní, který je potřebný k reprodukci zaznamenaných interakcí. Zde je návod, jak si to můžete sami vyzkoušet:

V nástroji Instruments a s vybraným nástrojem Automation vyhledejte v dolní části okna tlačítko Record (Nahrávání).

Klepnete-li na tlačítko Record (Nahrávání), nástroj Instruments spustí relaci nahrávání, jak ukazuje obrázek níže.

Instruments spustí vaši aplikaci v simulátoru iOS a vy s ní budete moci interagovat. Instruments bude generovat skript na základě vašich interakcí v reálném čase. Vyzkoušejte si to. Otáčejte Simulátorem iOS, klepněte na náhodná místa, proveďte gesto přejetí atd. Je to opravdu užitečný způsob, který vám pomůže prozkoumat možnosti automatizace uživatelského rozhraní.

Vyhnout se monolitické základně kódu

Jak asi tušíte, pokud budeme do testovacího souboru, který jsme vytvořili stejnou metodou, přidávat další testy, rychle se stane obtížně udržovatelným. Co můžeme udělat, aby k tomu nedošlo. Ve svých testech dělám dvě věci, abych tento problém vyřešil:

  • Jeden test pro jednu funkci: To znamená, že testy, které píšeme, musí být zaměřeny na konkrétní část funkce. Dám mu dokonce vhodné jméno, například testEmptyInputField.
  • Seskupím související testy do jednoho souboru: Související testy také seskupím do jednoho souboru. Díky tomu je kód v jednom souboru zvládnutelný. Usnadňuje to také testování jednotlivých částí funkčnosti spuštěním testů v konkrétním souboru. Kromě toho můžete vytvořit hlavní skript, ve kterém budete volat funkce nebo testy, které jste seskupili v jiných testovacích souborech.

V následujícím úryvku kódu importujeme soubor JavaScriptu a tím se nám zpřístupní funkce v tomto souboru JavaScriptu.

#import "OtherTests.js"

Závěr

V tomto kurzu jste se dozvěděli, jakou hodnotu má testování na vyšší úrovni a jak může automatizace uživatelského rozhraní pomoci tuto mezeru zaplnit. Je to další nástroj ve vaší sadě nástrojů, který vám pomůže zajistit dodávání spolehlivých a robustních aplikací.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.