
Volám sa Dmitrij, pracujem ako tester vo firme . Prednedávnom som sa venoval relatívne novej funkcii od — konkrétne, nástrojovému testovaniu iOS aplikácií pomocou natívneho testovacieho rámca XCUITest.
Predtým som už vyskúšal Firebase Test Lab pre Android a veľmi sa mi to páčilo, preto som sa rozhodol nastaviť testovaciu infraštruktúru pre projekt iOS na rovnaké koľajnice. Musel som veľa googliť a nie všetko sa mi podarilo na prvýkrát, takže som sa rozhodol napísať článok-tutoriál pre tých, ktorí to ešte len čaká.
Ak máte UI testy na projekte iOS, môžete už dnes vyskúšať spustiť ich na reálnych zariadeniach, ktoré láskavo poskytla Korporácia Dobra. Záujemcovia — vitajte pod kat.
V rozprávaní som sa rozhodol vychádzať z niektorých základných údajov — súkromného repozitára na GitHub a systému zostavovania CircleCI. Názov aplikácie — AmazingApp, bundleID — com.company.amazingapp. Tieto údaje uvádzam hneď, aby som znížil následnú zmätok.
Ak ste realizovali niektoré riešenia vo svojom projekte inak — podeľte sa o svoje skúsenosti v komentároch.
1. Samotné testy
Vytvárame novú vetvu projektu pre UI testy:
$ git checkout develop
$ git pull
$ git checkout -b “feature\/add-ui-tests”
Otvorme projekt v XCode a vytvoríme novú Cieľ (Target) s UI testami [XCode -> File -> New -> Target -> iOS Testing Bundle], dáme jej výstižný názov AmazingAppUITests.

Prejdeme do sekcie Build Phases vytvoreného Targetu a overíme prítomnosť Target Dependencies — AmazingApp, v Compile Sources — AmazingAppUITests.swift.
Dobrou praxou je oddelenie rôznych variantov zostavy do samostatných Schém (Schemes). Vytvoríme schému pre naše UI testy [XCode -> Product -> Scheme -> New Scheme] a dáme jej rovnaký názov: AmazingAppUITests.
Build vytvorenej schémy by mal obsahovať Target hlavnej aplikácie — AmazingApp a Target UI testov — AmazingAppUITests — pozri screenshot

Následne vytvoríme novú konfiguráciu zostavy pre UI testy. V XCode klikneme na súbor projektu, prejdeme do sekcie Info. Klikneme na “+” a vytvoríme novú konfiguráciu, napr. XCtest. To nám bude potrebné neskôr, aby sme sa vyhli komplikáciám, keď dôjde na podpisovanie kódu.

Vo vašom projekte sú aspoň tri Targety: hlavná aplikácia, jednotkové testy (veď tie máte, nie?) a cieľ UI testov, ktorý sme vytvorili.
Otvoríme Target AmazingApp, záložku Build Settings, sekciu Code Signing Identity. Pre konfiguráciu XCtest vyberáme iOS Developer. V sekcii Code Signing Style vyberáme Manual. Provisioning profile sme ešte nevygenerovali, ale neskôr sa k nemu určite vrátime.
Pre Target AmazingAppUITests robíme to isté, ale do poľa Product Bundle Identifier píšeme com.company.amazingappuitests.
2. Nastavenie projektu v Apple Developer Program
Otvoríme stránku Apple Developer Program, prejdeme do sekcie Certificates, Identifiers & Profiles a potom do poľa App IDs v časti Identifiers. Vytvárame nový App ID s názvom AmazingAppUITests a bundleID com.company.amazingappuitests.

Teraz máme možnosť podpisovať naše testy samostatným certifikátom, ale… Postup zostavenia buildu pre testovanie zahŕňa zostavenie samotnej aplikácie a zostavenia runnera testov. Tým pádom čelíme problému s podpisovaním dvoch bundle ID jedným provisioning profile. Našťastie existuje jednoduché a elegantné riešenie — Wildcard App ID. Opakujeme postup vytvorenia nového App ID, ale namiesto Explicit App ID vyberáme Wildcard App ID, ako na snímke.

V tomto kroku je práca s developer.apple.com ukončená, ale nebudeme zatvárať okno prehliadača. Ideme na a čítame o utilite Match od A po Z.
Pozorný čitateľ si všimol, že na používanie tejto utilitky potrebujeme súkromný repozitár a účet, ktorý má prístup ako k Apple Developer Program, tak aj k Githubu. Vytvoríme (ak náhodou taký neexistuje) účet typu InfrastructureAccount@your.company.domain, vymyslíme silné heslo, zaregistrujeme ho v developer.apple.com a určíme ho za správcu projektu. Potom dáme účtu prístup k github repozitáru vašej spoločnosti a vytvoríme nový súkromný repozitár s názvom, ako je AmazingAppMatch.
3. Nastavenie Fastlane a utility match
Otvoríme terminál, prejdeme do priečinka s projektom a inicializujeme fastlane, ako je uvedené v . Po zadaní príkazu
$ fastlane initbude navrhnuté zvoliť dostupné konfigurácie použitia. Vyberáme štvrtú možnosť — ručné nastavenie projektu.

V projekte sa vytvoril nový adresár fastlane, v ktorom sú dva súbory — Appfile a Fastfile. V skratke — v Appfile uchovávame servisné údaje, a v Fastfile definujeme jobs, v terminológii Fastlane nazývané lanes. Odporúčam prečítať si oficiálnu dokumentáciu: , .
Otvoríme Appfile v obľúbenom textovom editore a upravíme ho na nasledujúci formát:
app_identifier "com.company.amazingapp" # Bundle ID
apple_dev_portal_id "infrastructureaccount@your.company.domain" # Vytvorený infraštruktúrny účet, ktorý má právo upravovať iOS projekt v Apple Developer Program.
team_id "LSDY3IFJAY9" # Vaše ID tímu v Developerskom portáli
Vraciame sa do terminálu a podľa oficiálneho manuálu začíname nastavovať match.
$ fastlane match init
$ fastlane match development
Ďalej zadáme požadované údaje — repozitár, účet, heslo atď.
Dôležité: pri prvom spustení utilita match požiada o heslo na dešifrovanie repozitára. Je veľmi dôležité toto heslo si uložiť, na etape nastavenia CI servera nám bude ešte potrebné!
V priečinku fastlane sa objavil nový súbor — Matchfile. Otvoríme ho v obľúbenom textovom editore a upravíme na tento formát:
git_url("https://github.com/YourCompany/AmazingAppMatch") # Vytvorený súkromný repozitár na uchovávanie certifikátov a profilov.
type("development") # Predvolený typ, môže byť: appstore, adhoc, enterprise alebo development
app_identifier("com.company.amazingapp")
username("infrastructureaccount@your.company.domain") # Vaše používateľské meno účtu Infra v Apple Developer Portáli
Vyplňujeme práve takto, ak chceme neskôr používať match na podpisovanie buildov na nasadenie v Crashlytics a/alebo AppStore, t.j. na podpisovanie bundle ID vašej aplikácie.
Ale, ako si pamätáme, na podpisovanie testovacieho buildu sme vytvorili špeciálne Wildcard ID. Preto otvoríme Fastfile a zapíšeme nový lane:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # vytvárame samostatnú vetvu pre development certifikát na podpisovanie testovacej zostavy.
)
end
Uložíme, zadáme do terminálu
fastlane testing_build_for_firebasea vidíme, ako fastlane vytvoril nový certifikát a uložil ho do repozitára. Skvele!
Otvoríme XCode. Teraz máme potrebný provisioning profile typu Match Development com.company.*, ktorý treba uviesť v sekcii Provisioning profile pre ciele AmazingApp a AmazingAppUITests.

Ostáva dopísať lane na zostavenie testov. Ideme do projektu pluginu pre fastlane, ktorý uľahčuje nastavenie exportu do Firebase Test Lab a riadime sa pokynmi.
Zkopírujeme z pôvodného príkladu, aby náš lane testing_build_for_firebase napokon vyzeral takto:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests"
)
scan(
scheme: 'AmazingAppUITests', # UI Test scheme
clean: true, # Recommended: This would ensure the build would not include unnecessary files
skip_detect_devices: true, # Required
build_for_testing: true, # Required
sdk: 'iphoneos', # Required
should_zip_build_products: true, # Must be true to set the correct format for Firebase Test Lab
)
firebase_test_lab_ios_xctest(
gcp_project: 'AmazingAppUITests', # Your Google Cloud project name (k tejto vete sa neskôr vrátime)
devices: [ # Device(s) to run tests on
{
ios_model_id: 'iphonex', # Device model ID, see gcloud command above
ios_version_id: '12.0', # iOS version ID, see gcloud command above
locale: 'en_US', # Optional: default to en_US if not set
orientation: 'portrait' # Optional: default to portrait if not set
}
]
)
end
Odporúčam si prečítať oficiálnu dokumentáciu pre úplné informácie o nastavení fastlane v CircleCI. .
Nezabúdame doplniť náš config.yml o novú úlohu:
build-for-firebase-test-lab:
macos:
xcode: "10.1.0"
working_directory: ~\/project
shell: \/bin\/bash --login -o pipefail
steps:
- checkout
- attach_workspace:
at: ~\/project
- run: sudo bundle install # aktualizujeme závislosti
- run:
name: install gcloud-sdk # na mac počítač je potrebné nainštalovať gcloud
command: |
ruby -e "$(curl -fsSL https:\/\/raw.githubusercontent.com\/Homebrew\/install\/master\/install)" \/dev\/null ; brew install caskroom\/cask\/brew-cask 2>\/dev\/null
brew cask install google-cloud-sdk
- run:
name: build app for testing
command: fastlane testing_build_for_firebase # spúšťame lane zostavenia a odoslania do firebase
4. A čo náš testovací stánok? Nastavujeme Firebase.
Pustíme sa do toho, na čo bola táto článok napísaná.
Možno vaša aplikácia používa Firebase na bezplatnom tarife, alebo ho možno vôbec nepoužíva. V zásade to nezohráva žiadnu úlohu, pretože na testovacie účely môžeme vytvoriť samostatný projekt s rokom bezplatného používania (super, čo?);
Prihlasujeme sa do nášho infraštruktúrneho účtu (alebo iného, na tom nezáleží) a ideme na . Vytvárame nový projekt s názvom AmazingAppUITests.
Dôležité: V predchádzajúcom kroku by parameter gcp_project v Fastfile v lane firebase_test_lab_ios_xctest mal zodpovedať názvu projektu.

Základné nastavenia sú pre nás celkom v poriadku.
Nezatvárajte kartu, pod tým istým účtom sa registrujeme v — je to nevyhnutná potreba, pretože komunikácia s Firebase prebieha pomocou rozhrania konzoly gcloud.
Google ponúka 300 $ na rok, čo v kontexte vykonávania automatizovaných testov zodpovedá celému roku bezplatného používania služby. Zadajte platobné údaje, počkajte na testovaciu transakciu 1 $ a získajte 300 $ na svoj účet. Po uplynutí roka bude projekt automaticky preložený na bezplatný tarifný plán, takže nemusíte mať obavy o možnú stratu peňazí.
Vrátime sa na kartu s projektom Firebase a preložíme ho na tarifný plán Blaze — teraz máme čím platiť v prípade prekročenia limitu.
V rozhraní gcloud vyberieme náš projekt Firebase, v hlavnom menu zvolíme položku „Adresár“ a pridáme Cloud Testing API a Cloud Tools Result API.

Potom prejdeme do ponuky „IAM a správa“ -> Služobné účty -> Vytvoriť služobný účet. Udelíme práva na úpravu projektu.

Vytvárame API kľúč vo formáte JSON

Stiahnutý JSON budeme potrebovať neskôr, zatiaľ považujme nastavenie Test Lab za dokončené.
5. Nastavenie CircleCI
Nazdiera sa rozumná otázka — čo s heslami? Spoľahlivo uložiť naše heslá a iné citlivé údaje nám pomôže mechanizmus premenných prostredia našej build mašiny. V nastaveniach projektu CircleCI vyberieme Environment Variables

A vytvoríme nasledujúce premenné:
- kľúč: GOOGLE_APPLICATION_CREDENTIALS
hodnota: obsah json súboru kľúča služobného účtu gcloud - kľúč: MATCH_PASSWORD
hodnota: heslo na dešifrovanie github repozitára so certifikátmi - kľúč: FASTLANE_PASSWORD
hodnota: heslo infraštruktúrneho účtu Apple Developer Portal
Uložíme zmeny, vytvoríme PR a posunieme na review svojmu tímovému vedúcemu.
Zhrnutie
V dôsledku týchto jednoduchých manipulácií sme získali dobrý, stabilne fungujúci stand s možnosťou nahrávania videa zo zariadenia počas testovania. V testovacom príklade som uvedol model zariadenia iPhone X, ale farmácia ponúka bohatý výber z kombinácií rôznych modelov a verzií iOS.
Druhá časť bude venovaná krok za krokom nastaveniu Firebase Test Lab pre Android projekt.
Zdroj: habr.com
