Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

Volám sa Dmitrij, pracujem ako tester vo firme MEL Science. Prednedávnom som sa venoval relatívne novej funkcii od Firebase Test Lab — 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.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

V tomto kroku je práca s developer.apple.com ukončená, ale nebudeme zatvárať okno prehliadača. Ideme na webovú stránku s dokumentáciou k Fastlane 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 oficiálnom manuáli. Po zadaní príkazu

$ fastlane init

bude navrhnuté zvoliť dostupné konfigurácie použitia. Vyberáme štvrtú možnosť — ručné nastavenie projektu.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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: raz, dva.

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_firebase

a 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.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

Ostáva dopísať lane na zostavenie testov. Ideme do repozitár 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. raz, dva.

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 stránku konzoly Firebase.. 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.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

Základné nastavenia sú pre nás celkom v poriadku.

Nezatvárajte kartu, pod tým istým účtom sa registrujeme v Gcloud. — 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.

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt

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

Spúšťame nástrojové testy vo Firebase Test Lab. Časť 1: iOS projekt
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

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster