Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

A nevem Dmitrij, tesztelőként dolgozom a cégnél. MEL Science. Nemrégiben fejeztem be egy viszonylag új funkcióval való megismerkedést, Firebase Test Lab — nevezetesen az iOS alkalmazások instrumentális tesztelésével natív tesztelési keretrendszer, az XCUITest használatával.

Előtte már kipróbáltam a Firebase Test Lab-ot Androidra, és nagyon tetszett, ezért úgy döntöttem, hogy megpróbálom az iOS projekt tesztinfrastruktúráját is hasonló módon felállítani. Nagyon sokat kellett keresgélnem, és nem minden sikerült elsőre, ezért úgy döntöttem, hogy írok egy útmutatót azok számára, akiknek ez még előttük áll.

Tehát, ha vannak UI tesztjeitek az iOS projektben, már ma kipróbálhatjátok őket valódi eszközökön, amelyeket a Jótevő Vállalat bocsát rendelkezésetekre. Akik érdeklődnek, szeretettel várunk a továbbiakban.

A narrációban néhány alapadatból indultam ki — egy privát GitHub tárolóból és a CircleCI építési rendszerből. Az alkalmazás neve — AmazingApp, bundleID — com.company.amazingapp. Ezeket az adatokat az elején írom le, hogy elkerüljük a későbbi zűrzavart.

Ha az adott megoldásokat másképp valósítottátok meg a projektetekben, kérjük, osszátok meg tapasztalataitokat a megjegyzések között.

1. Maguk a tesztek

Készítsünk egy új projektágat az UI tesztek számára:

$ git checkout develop
$ git pull
$ git checkout -b "feature/add-ui-tests"

Nyissuk meg a projektet az XCode-ban, és hozzunk létre egy új célt (Target) UI tesztekkel [XCode -> File -> New -> Target -> iOS Testing Bundle], adjunk neki egy beszédes nevet: AmazingAppUITests.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Lépjünk a létrehozott Target Build Phases szekciójába, és ellenőrizzük, hogy megvan-e a Target Dependencies — AmazingApp, a Compile Sources-ban — AmazingAppUITests.swift.

Jó gyakorlat, ha a különböző build változatokat külön Sémákba (Schemes) soroljuk. Hozzunk létre egy sémát az UI tesztjeinkhez [XCode -> Product -> Scheme -> New Scheme], és adjuk neki ugyanezt a nevet: AmazingAppUITests.

A létrehozott séma buildjének tartalmaznia kell az alap alkalmazás Targetet — AmazingApp és a UI tesztek Targetjét — AmazingAppUITests — lásd a képernyőképet.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Ezután hozzunk létre egy új build konfigurációt az UI tesztekhez. Az XCode-ban kattintsunk a projekt fájlra, lépjünk az Info szekcióra. Kattintsunk a "+" jelre, és hozzunk létre egy új konfigurációt, például XCtest. Erre szükségünk lesz később, hogy elkerüljük a bonyodalmakat, amikor a kód aláírásra kerül a sor.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

A projektedben legalább három Targetnek kell lennie: az alap alkalmazásnak, a unit teszteknek (hiszen azok léteznek, nem igaz?) és a mi általunk létrehozott UI teszt Targetnek.

Belépünk a Target AmazingApp-ba, az Build Settings fülre, a Code Signing Identity szakaszba. Az XCtest konfigurációhoz válasszuk az iOS Developer-t. A Code Signing Style szakaszban válasszuk a Manual-t. A Provisioning profilt még nem generáltuk, de hamarosan visszatérünk rá.

A Target AmazingAppUITests esetében ugyanazt csináljuk, de a Product Bundle Identifier mezőbe írjuk be a com.company.amazingappuitests értéket.

2. A projekt beállítása az Apple Developer Programban

Lépjünk be az Apple Developer Program oldalára, a Certificates, Identifiers & Profiles részhez, majd az Identifiers szakaszban a App IDs mezőbe. Hozzunk létre egy új App ID-t AmazingAppUITests néven és bundleID-ként a com.company.amazingappuitests-t.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Most lehetőségünk van az egyes tesztjeinket külön tanúsítvánnyal aláírni, de… A tesztelési build építési eljárása magában foglalja az alkalmazás és a tesztelő runner buildjének felépítését. Ennek megfelelően szembesülünk azzal a problémával, hogy két bundle ID-hez egy provisioning profilt kell társítanunk. Szerencsére van egy egyszerű és elegáns megoldás — Wildcard App ID. Ismételjük meg az új App ID létrehozásának eljárását, de az Explicit App ID helyett válasszuk a Wildcard App ID-t, ahogy a képernyőképen látható.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Ezen a ponton a munka a developer.apple.com oldallal befejeződik, de nem fogjuk bezárni a böngészőablakot. Lépjünk a Fastlane dokumentációs weboldalára és olvassuk el a Match eszközről részletesen.

A figyelmes olvasó észrevette, hogy ennek az eszköznek a használatához privát tárolóra és olyan fiókra van szükség, amely hozzáféréssel rendelkezik az Apple Developer Programhoz és a Githubhoz. Hozzunk létre (ha még nincs ilyen) InfrastructureAccount@your.company.domain nevű fiókot, találjunk ki egy erős jelszót, regisztráljuk a developer.apple.com oldalon, és tegyük a projekt adminisztrátorává. Ezután biztosítsuk a fiók hozzáférését a cég Github tárolójához, és hozzunk létre egy új privát tárolót AmazingAppMatch néven.

3. Fastlane és a Match eszköz beállítása

Nyissuk meg a terminált, lépjünk be a projekt mappájába, és inicializáljuk a fastlane-t a hivatalos kézikönyvben leírtak szerint.A parancs bevitele után

$ fastlane init

fel fog ajánlani elérhető használati konfigurációkat. Válasszuk a negyedik lehetőséget — a projekt kézi beállítását.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

A projektünkben megjelent egy új fastlane könyvtár, amelyben két fájl található — Appfile és Fastfile. Röviden — az Appfile-ben tároljuk a segédadatokat, a Fastfile-ban pedig a jobs-ot, amelyeket Fastlane terminológia szerint lanes-nek nevezünk. Javaslom az hivatalos dokumentáció elolvasását: egyszer, kétszer.

Nyissuk meg az Appfile-t a kedvenc szövegszerkesztőnkben, és állítsuk be a következőképpen:

app_identifier "com.company.amazingapp"       # Bundle ID
apple_dev_portal_id "infrastructureaccount@your.company.domain"  # Létrehozott infrastruktúra fiók, amely jogosultsággal rendelkezik az iOS projekt szerkesztésére az Apple Developer Programban.
team_id "LSDY3IFJAY9" # A fejlesztői portál csapatazonosítója

Térjünk vissza a terminálhoz, és a hivatalos útmutató alapján kezdjük el beállítani a match-et.

$ fastlane match init
$ fastlane match development

Ezután adjuk meg a kért adatokat — repository, fiók, jelszó stb.

Fontos: Első indításkor a match eszköz kérni fogja a repository titkosításának feloldásához szükséges jelszót. Nagyon fontos, hogy megőrizzük ezt a jelszót, mert a CI szerver beállításakor szükségünk lesz rá!

A fastlane mappában megjelent egy új fájl — Matchfile. Nyissuk meg kedvenc szövegszerkesztőnkkel, és hozzuk a következő formába:

git_url("https://github.com/YourCompany/AmazingAppMatch") # Létrehozott privát repository a tanusítványok és profillapok tárolására.
type("development") # Az alapértelmezett típus, lehet: appstore, adhoc, enterprise vagy development
app_identifier("com.company.amazingapp")
username("infrastructureaccount@your.company.domain") # Az Apple Developer Portal infrastruktúra fiókusername

Pontosan így töltsük ki, ha a későbbiekben a match-et szeretnénk használni a buildok aláírására a Crashlytics és/vagy AppStore számára, azaz az alkalmazás bundle ID aláírására.

De, ahogy tudjuk, a teszt build aláírásához létrehoztunk egy külön Wildcard ID-t. Ezért nyissuk meg a Fastfile-t, és írjuk be az új lane-t:

lane :testing_build_for_firebase do

    match(
      type: "development",
      readonly: true,
      app_identifier: "com.company.*",
      git_branch: "uitests"  # létrehozunk egy külön ágat a development tanúsítvány számára a teszt build aláírásához.
    )

end

Mentjük, beírjuk a terminálba

fastlane testing_build_for_firebase

és látjuk, ahogy a fastlane létrehozta az új tanúsítványt és elhelyezte a repository-ban. Remek!

Nyissuk meg az XCode-t. Most már van szükséges provisioning profilunk a következő formában: Match Development com.company.*, amelyet fel kell tüntetni a Provisioning profile szekcióban az AmazingApp és AmazingAppUITests célokhoz.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Már csak el kell készíteni a lane-t a tesztek összeállításához. Lépjünk a tárhely fastlane plugin projekthez, amely megkönnyíti a Firebase Test Lab-ba történő exportálás beállítását, és kövessük az utasításokat.

Másoljuk be az eredeti példát, hogy a testing_build_for_firebase lane végül így nézzen ki:


 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 (ehhez a sorhoz később visszatérünk)
      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

A CircleCI-ben a fastlane beállításának teljes információjáért ajánlom az hivatalos dokumentáció elolvasását. egyszer, kétszer.

Ne felejtsük el kiegészíteni a config.yml fájlunkat az új feladattal:

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     # frissítjük a függőségeket
     - run:
         name: install gcloud-sdk   # a mac gépre telepíteni kell a gcloud-ot
         command: |
           ruby -e "$(curl -fsSL https:\/\/raw.githubusercontent.com\/Homebrew\/install\/master\/install)" < \/dev\/null 2> \/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  # elindítjuk a build eljárást és küldjük a firebase-be

4. De mi a helyzet a tesztelési környezetünkkel? Beállítjuk a Firebase-t.

Most vágjunk bele, tulajdonképpen ezért íródott a cikk.

Lehet, hogy az alkalmazásod a Firebase ingyenes tarifáját használja, vagy lehet, hogy egyáltalán nem használja. Nincs elvi különbség, mert tesztelési célokra létrehozhatunk egy külön projektet, ingyenes éves használattal (menő, nem?).

Bejelentkezünk az infrastruktúra fiókunkba (vagy bármely másba, mindegy), és megyünk a Firebase konzol oldalára.Létrehozunk egy új projektet AmazingAppUITests néven.

Fontos: Az előző lépésben a Fastfile-ban a lane firebase_test_lab_ios_xctest gcp_project paramétere a projekt nevéhez kell hogy illeszkedjen.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Az alapértelmezett beállítások számunkra megfelelőek.

Ne zárd be a lapot, ugyanazzal a fiókkal jelentkezz be a Gcloudba. Ez egy szükséges lépés, mivel a Firebase-szel való kommunikáció a gcloud konzol felületén történik.

A Google 300 dollárt ad 1 évre, ami az automatizált tesztek végrehajtása szempontjából egy év ingyenes szolgáltatásnak felel meg. Beírjuk a fizetési adatokat, megvárjuk az 1 dolláros tesztelési levonást, és 300 dollárt kapunk a számlára. Egy év elteltével a projekt automatikusan ingyenes tarifára vált, így nem kell aggódni a pénz elvesztése miatt.

Térjünk vissza a Firebase projekt füléhez, és váltsunk a Blaze tarifára – most már van, amivel fizetni tudunk a limitek túllépése esetén.

A gcloud felületén kiválasztjuk a Firebase projektünket, a főmenü "Katalógus" pontját választjuk, és hozzáadjuk a Cloud Testing API-t és a Cloud Tools Result API-t.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

Ezután a menü "IAM és adminisztráció" -> Szolgáltatási fiókok -> Szolgáltatási fiók létrehozása pontjára lépünk. Megadjuk a projekt szerkesztésére vonatkozó jogokat.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

API kulcsot hozunk létre JSON formátumban.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt

A letöltött JSON-ra később szükségünk lesz, addig is a Test Lab beállítást befejezettnek tekintjük.

5. CircleCI beállítása

Felmerül a jogos kérdés – mi legyen a jelszavakkal? A jelszavaink és egyéb érzékeny adataink biztonságos tárolásához a build gépünk környezeti változóinak mechanizmusát használhatjuk. A CircleCI projekt beállításaiban válasszuk a Környezeti Változók pontot.

Eszköz tesztek indítása a Firebase Test Lab-ban. 1. rész: iOS projekt
És létrehozzuk a következő változókat:

  • kulcs: GOOGLE_APPLICATION_CREDENTIALS
    érték: a gcloud szolgáltatási fiók kulcsának JSON fájl tartalma
  • kulcs: MATCH_PASSWORD
    érték: a github repositorium titkosításához szükséges jelszó
  • kulcs: FASTLANE_PASSWORD
    érték: az Apple Developer Portal infrastruktúra fiókjának jelszava

Mentjük a módosításokat, létrehozunk egy PR-t, és elküldjük a review-ra a csapatvezetőnknek.

Összegzés

Ezeknek az egyszerű műveleteknek a végrehajtásával egy jó, stabilan működő standot kaptunk, amely lehetővé teszi a képernyővideó rögzítését az eszköz tesztelése közben. A teszt példámban az iPhone X eszközmodellt adtam meg, de a farm gazdag választékot kínál különböző modellek és iOS verziók kombinációiból.

A második rész a Firebase Test Lab lépésről lépésre történő beállításának fog szentelődni Android projekt számára.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster