
Minu nimi on Dmitri, töötan testijana ettevĂ”ttes . Hiljuti lĂ”petasin suhteliselt uue funktsiooni uurimise, mille kohta â nimelt, iOS rakenduste instrumentaalsest testimisest kasutades natiivset testimisraamistiku XCUITest.
Enne seda olin juba proovinud Firebase Test Lab'i Androidi jaoks ja mulle meeldis see vÀga, seega otsustasin proovida iOS projekti testimisstruktuuri samadele rööbastele seadistada. Pidin palju guugeldama ja mitte kÔik ei Ônnestunud esimesel korral, seetÔttu otsustasin kirjutada Ôpetusartikli neile, kes seisavad selle ees.
Seega, kui teil on UI testid iOS projektis, siis saate juba tĂ€na proovida neid kĂ€ivitada reaalsetel seadmetel, mida lahkelt pakub Heategevuskorporatsioon. Huvi tundnud â olete teretulnud allolevasse osa.
Jutustuses otsustasin lĂ€htuda teatud algandmetest â privaatne reposteetory GitHub'is ja ehitussĂŒsteem CircleCI. Rakenduse nimi on AmazingApp, bundleID â com.company.amazingapp. Toon need andmed kohe vĂ€lja, et vĂ€hendada hilisemaid segadusi.
Kui olete oma projektis teatud lahendusi teisiti rakendanud, jagage oma kogemusi kommentaarides.
1. Testid
Loome uue projekti haru UI testide jaoks:
$ git checkout develop
$ git pull
$ git checkout -b "feature/add-ui-tests"
Avame projekti XCode'is ja loome uue sihtmÀrgi (Target) UI testide jaoks [XCode -> File -> New -> Target -> iOS Testing Bundle], anname sellele kÔlava nime AmazingAppUITests.

Mineme loodud sihtmÀrgi Build Phases sektsiooni ja kontrollime, kas Target Dependencies - AmazingApp, Compile Sources - AmazingAppUITests.swift on olemas.
Heaks tavaks on erinevate ehituste variantide eraldamine eraldi skeemidesse (Schemes). Loome skeemi meie UI testide jaoks [XCode -> Product -> Scheme -> New Scheme] ja anname sellele sama nime: AmazingAppUITests.
Loodud skeemi build peab sisaldama pÔhirakenduse Targetit - AmazingApp ja UI testide Targetit - AmazingAppUITests - vt ekraanipilte.

SeejÀrel loome UI testide jaoks uue ehituse konfiguratsiooni. XCode'is klÔpsame projekti failil, lÀheme Info sektsiooni. KlÔpsame " + " ja loome uue konfiguratsiooni, nÀiteks XCtest. See on vajalik edaspidi, et vÀltida segadust, kui jÔuame code signing'uni.

Teie projektis on vĂ€hemalt kolm Targetit: pĂ”hirakendus, ĂŒksuse testid (need on ju olemas, eks?) ja meie poolt loodud Target UI testide jaoks.
Siseneme Target AmazingApp, vahekaart Build Settings, jaotis Code Signing Identity. Konfiguratsiooni jaoks XCtest valime iOS Developer. Jaotises Code Signing Style valime Manual. Provisioning profile'i me veel ei genereerinud, kuid naaseme sellele hiljem kindlasti.
Target AmazingAppUITests jaoks teeme sama, kuid vÀljale Product Bundle Identifier kirjutame com.company.amazingappuitests.
2. Projekti seadistamine Apple Developer Programis
Siseneme Apple Developer Programi lehele, lÀheme jaotisse Certificates, Identifiers & Profiles ja seejÀrel Identifiers punkti all App IDs. Loome uue App ID nimega AmazingAppUITests ja bundleID com.company.amazingappuitests.

NĂŒĂŒd on meil vĂ”imalus allkirjastada meie testid eraldi sertifikaadiga, kuid⊠Testimise build'i koostamise protseduur tĂ€hendab rakenduse enda ja testide kĂ€itaja build'i koostamist. SeetĂ”ttu seisame silmitsi kahe bundle ID allkirjastamise probleemiga ĂŒhe provisioning profile'iga. Ănneks on olemas lihtne ja elegantne lahendus â Wildcard App ID. Korrake uue App ID loomise protseduuri, kuid valige Explicit App ID asemel Wildcard App ID nagu ekraanipildil.

Selles etapis on töö developer.apple.com lĂ”petatud, kuid me ei sulge brauseri akent. Liigume ja loeme utiliidist Match kĂ”ik sĂŒgavale sisse.
Hoolikas lugeja on mÀrganud, et selle utiliidi kasutamiseks on meil vaja privaatset hoidlat ja kontot, mis on ligipÀÀsudega nii Apple Developer Programile kui ka Githubile. Loome (kui sellist pole) konto vormis InfrastructureAccount@your.company.domain, mÔtleme vÀlja tugeva parooli, registreerime selle developer.apple.com-is ja mÀÀrame projekti administraatoriks. Edasi, anname kontole ligipÀÀsu teie ettevÔtte githubi hoidlasse ja loome uue privaatse hoidla nimega AmazingAppMatch.
3. Fastlane'i ja utiliidi match seadistamine
Avame terminali, liigume projekti kausta ja initsialiseerime fastlane'i nagu on toodud . PÀrast kÀsu sisestamist
$ fastlane initpakutakse valida olemasolevaid konfiguratsioone. Valime neljanda punkti â projekti kĂ€sitsi seadistamine.

Projektis on ilmunud uus kaust fastlane, kus asuvad kaks faili â Appfile ja Fastfile. ĂhesĂ”naga â Appfile's hoiame teenuste andmeid ja Fastfile's mÀÀratleme töid, mida Fastlane'i terminoloogias nimetatakse lanes. Soovitan lugeda ametlikku dokumentatsiooni: , .
Avame Appfile oma lemmik tekstiredaktoriga ja viime selle jÀrgmisse vormingusse:
app_identifier "com.company.amazingapp" # Paketi ID
apple_dev_portal_id "infrastructureaccount@your.company.domain" # Loodud infrastruktuuri konto, millel on Ôigus redigeerida iOS projekti Apple'i arendaja programmis.
team_id "LSDY3IFJAY9" # Teie arendaja portaali meeskonna ID
Naaseme terminali ja vastavalt ametlikule juhendile alustame match'i seadistamist.
$ fastlane match init
$ fastlane match development
SeejĂ€rel sisestame nĂ”utud andmed â reposiit, konto, parool jne.
Oluline: esimese kĂ€ivitamise ajal palub utiliit match sisestada parooli reposiidi dekrĂŒpteerimiseks. On vĂ€ga oluline see parool sĂ€ilitada, see tuleb meil kasuks CI serveri seadistamise etapis!
Kaas fastlane'is ilmus uus fail â Matchfile. Avame oma lemmik tekstiredaktoriga ja viime selle jĂ€rgmisse vormingusse:
git_url("https://github.com/YourCompany/AmazingAppMatch") #Privaatne repo, mille eesmÀrk on hoida sertifikaate ja profiile.
type("development") # Vaikimisi tĂŒĂŒp: appstore, adhoc, enterprise vĂ”i development
app_identifier("com.company.amazingapp")
username("infrastructureaccount@your.company.domain") # Teie infrastruktuuri konto Apple Developer Portali kasutajanimi
TÀidame selle just niimoodi, kui tahame hiljem kasutada match'i versioonide allkirjastamiseks, mis on mÔeldud Crashlytics ja/vÔi AppStore'i jaoks, st teie rakenduse bundle ID allkirjastamiseks.
Aga nagu me teame, oleme testversiooni allkirjastamiseks loonud spetsiaalse Wildcard ID. Seega avame Fastfile'i ja lisame uue lane:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # loome eraldi haru development sertifikaadi jaoks testversiooni allkirjastamiseks.
)
end
Salvestame, sisestame terminali
fastlane testing_build_for_firebaseja nÀeme, kuidas fastlane lÔi uue sertifikaadi ja salvestas selle repo. SuurepÀrane!
Avame XCode'i. NĂŒĂŒd on meil vajalik provisioning profile, Match Development com.company.*, mille peame mÀÀrama AmazingApp ja AmazingAppUITests sihtmĂ€rkide Provisioning profile sektsioonis.

Peab nĂŒĂŒd lisama lane testide koostamiseks. Liigume fastlane'i plugina projekt, mis hĂ”lbustab Firebase Test Labi eksportimise seadistamist ja jĂ€rgib juhiseid.
Kopeerime algsest nÀitest, et meie lane testing_build_for_firebase lÔpuks vÀlja nÀeks:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests"
)
scan(
scheme: 'AmazingAppUITests', # UI testimise skeem
clean: true, # Soovitatav: see tagab, et ehitus ei sisaldaks tarbetuid faile
skip_detect_devices: true, # NÔutav
build_for_testing: true, # NÔutav
sdk: 'iphoneos', # NÔutav
should_zip_build_products: true, # Peab olema tÔene, et seada Ôige formaat Firebase Test Lab'i jaoks
)
firebase_test_lab_ios_xctest(
gcp_project: 'AmazingAppUITests', # Teie Google Cloud'i projekti nimi (naaseme selle rea juurde hiljem)
devices: [ # Seade(d), millega teste kÀitada
{
ios_model_id: 'iphonex', # Seadmeme mudeli ID, vaata gcloud kĂ€sku ĂŒlal
ios_version_id: '12.0', # iOS versiooni ID, vaata gcloud kĂ€sku ĂŒlal
locale: 'en_US', # Valikuline: vaikimisi en_US, kui pole seadistatud
orientation: 'portrait' # Valikuline: vaikimisi portrait, kui pole seadistatud
}
]
)
end
Fastlane'i seadistamise kohta CircleCI-s soovitan lugeda ametlikku dokumentatsiooni. .
Ărge unustage tĂ€iendama meie config.yml uut ĂŒlesannet:
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 # uuendame sÔltuvused
- run:
name: install gcloud-sdk # maci masinale tuleb gcloud installida
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 # kÀivitame lane'i koostamiseks ja saadmiseks firebase'i
4. Aga kuidas meie testimisplatvorm? Seame ĂŒles Firebase.
Alustame tegelikult sellest, milleks artikkel kirjutati.
VĂ”ib-olla kasutab teie rakendus Firebase'i tasuta plaanil, vĂ”ib-olla ei kasuta seda ĂŒldse. Olulist vahet ei ole, kuna testimise vajadusteks vĂ”ime luua eraldi projekti, millel on aasta tasuta kasutust (pole paha, eks?)
Logime sisse oma infrastruktuuri kontole (vÔi mÔnele muule, pole vahet) ja suundume . Loome uue projekti nimega AmazingAppUITests.
Oluline: Eelmises sammus Fastfile'is lane firebase_test_lab_ios_xctest parameeter gcp_project peab vastama projekti nimele.

Meie vaikeseaded sobivad meile tÀielikult.
Ărge sulgege vahekaart, registreerige sama konto alla â see on sunnitud meede, kuna suhtlemine Firebase'iga toimub gcloudi konsooli liidese kaudu.
Google annab 300$ aastas, mis autotehtuste kontekstis vastab aasta tasuta teenuse kasutusele. Sisestame makseandmed, ootame testimistasu 1$ ning saame kontole 300$. Aasta möödudes projekti automaatselt tasuta paketile viimine, seega ei pea muretsema rahakaotuse pÀrast.
Naaseme Firebase projekti vahekaardile ja viime selle Blaze paketile â nĂŒĂŒd on meil raha, et ĂŒletada limiite.
Gcloudi liideses valime meie Firebase projekti, valime peamenĂŒĂŒst âKataloogâ ja lisame Cloud Testing API ja Cloud Tools Result API.

SeejĂ€rel liigume menĂŒĂŒsse âIAM ja haldamineâ -> Teenusekontod -> Loo teenusekonto. Anname projekti redigeerimisĂ”igused.

Loome JSON-formaadis API vÔtme

Allalaaditud JSON tuleb meil hiljem, kuid seni loeme Test Labi seadistamise lÔpetatuks.
5. CircleCI seadistamine
Tuleb Ă”igustatud kĂŒsimus â mida teha paroolidega? Meie paroolide ja teiste tundlike andmete turvaliseks hoidmiseks aitab meid meie ehitusmasina keskkonnamuutujate mehhanism. Projekti CircleCI seadetes valime Keskkonnamuutujad

Ja loome jÀrgmised muutujad:
- vÔti: GOOGLE_APPLICATION_CREDENTIALS
vÀÀrtus: gcloud teenuse konto vÔtme JSON faili sisu - vÔti: MATCH_PASSWORD
vÀÀrtus: parool GitHubi sertifikaatide hoidmise repositorio dekodeerimiseks - vÔti: FASTLANE_PASSWORD
vÀÀrtus: Apple Developer Portali infrastruktuurkontot parool
Salvestame muudatused, loome PR ja saadame ĂŒlevaatamiseks oma tiimijuhile.
KokkuvÔte
Tulemusena nende lihtsate manipuleerimiste tÀitmine saime hea, stabiilselt töötava seisu ekraanivideote salvestamise vÔimalusega seadme testimise kÀigus. TestnÀites mÀrkisin seadme mudeliks iPhone X, kuid farm pakub laia valikut erinevate mudelite ja iOS-i versioonide kombinatsioone.
Teine osa keskendub samm-sammult Firebase Test Labi seadistamisele Android projekti jaoks.
Allikas: habr.com
