
A nevem Dmitrij, tesztelőként dolgozom a cégnél. . Nemrégiben fejeztem be egy viszonylag új funkcióval való megismerkedést, — 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.

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.

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.

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.

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

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 é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 A parancs bevitele után
$ fastlane initfel 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.

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

Már csak el kell készíteni a lane-t a tesztek összeállításához. Lépjünk a 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. .
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 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.

Az alapértelmezett beállítások számunkra megfelelőek.
Ne zárd be a lapot, ugyanazzal a fiókkal jelentkezz be a 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.

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.

API kulcsot hozunk létre JSON formátumban.

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.

É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
