
Mitt namn Ă€r Dmitrij, jag arbetar som tester inom företaget . Jag har precis blivit klar med att utforska en relativt ny funktion frĂ„n â nĂ€mligen, med instrumentellt testande av iOS-appar med hjĂ€lp av det inbyggda testningsramverket XCUITest.
Tidigare har jag redan provat Firebase Test Lab för Android och jag gillade det mycket, sÄ jag bestÀmde mig för att försöka sÀtta upp testinfrastrukturen för mitt iOS-projekt pÄ samma sÀtt. Jag var tvungen att googla mycket och allt gick inte bra första gÄngen, dÀrför bestÀmde jag mig för att skriva en artikel/tutorial för dem som fortfarande har detta framför sig.
SĂ„ om ni har UI-tester i ert iOS-projekt, kan ni redan idag prova att köra dem pĂ„ verkliga enheter, vĂ€nligt tillhandahĂ„llna av VĂ€lfĂ€rdsbolaget. De som Ă€r intresserade â vĂ€lkomna nedan.
I berĂ€ttelsen har jag valt att utgĂ„ frĂ„n viss grunddata â ett privat repository pĂ„ GitHub och byggsystemet CircleCI. Appens namn â AmazingApp, bundleID â com.company.amazingapp. Jag ger dessa uppgifter direkt för att minska eventuell förvirring senare.
Om ni har implementerat vissa lösningar i ert projekt pĂ„ ett annat sĂ€tt â dela gĂ€rna med er av erfarenheter i kommentarerna.
1. Tester
Skapa en ny gren av projektet för UI-tester:
$ git checkout develop
$ git pull
$ git checkout -b "feature/add-ui-tests"
Ăppna projektet i XCode och skapa ett nytt mĂ„l (Target) för UI-tester [XCode -> File -> New -> Target -> iOS Testing Bundle], ge det ett talande namn AmazingAppUITests.

GÄ till sektionen Build Phases för det skapade mÄlet och kontrollera att Target Dependencies inkluderar AmazingApp, i Compile Sources bör AmazingAppUITests.swift finnas.
En bra praxis Àr att sÀrskilja olika varianter av byggen i separata Scheman. Skapa ett schema för vÄra UI-tester [XCode -> Product -> Scheme -> New Scheme] och ge det samma namn: AmazingAppUITests.
Bygget av det skapade schemat ska inkludera Target för huvudapplikationen â AmazingApp och Target för UI-tester â AmazingAppUITests â se skĂ€rmdump.

DÀrefter skapar vi en ny byggkonfiguration för UI-tester. I XCode klickar vi pÄ projektfilen, gÄr till sektionen Info. Klicka pÄ '+' och skapa en ny konfiguration, exempelvis XCtest. Detta kommer att behövas senare för att undvika problem nÀr det kommer till code signing.

I ert projekt finns det minst tre Targets: huvudapplikationen, enhetstester (för de finns vÀl, eller hur?) och det mÄl för UI-tester som vi har skapat.
GÄ in i Target AmazingApp, fliken BygginstÀllningar, avsnittet Code Signing Identity. För konfigurationen XCtest vÀljer vi iOS Developer. I avsnittet Code Signing Style vÀljer vi Manual. Provisioning profile har vi Ànnu inte genererat, men vi kommer att Äterkomma till det snart.
För Target AmazingAppUITests gör vi likadant, men i fÀltet Product Bundle Identifier skriver vi com.company.amazingappuitests.
2. Konfigurera projektet i Apple Developer Program
GÄ till sidan Apple Developer Program, gÄ till avsnittet Certifikat, Identifierare & profiler och sedan till fÀltet App IDs i punkten Identifierare. Skapa en ny App ID med namnet AmazingAppUITests och bundleID com.company.amazingappuitests.

Nu har vi möjlighet att signera vĂ„ra tester med ett separat certifikat, men⊠Byggproceduren för att testa innebĂ€r att vi mĂ„ste bygga sjĂ€lva applikationen och bygga test Runner. DĂ€rmed stöter vi pĂ„ problemet att signera tvĂ„ bundle ID med en provisioneringsprofil. Lyckligtvis finns det en enkel och elegant lösning â Wildcard App ID. Upprepa proceduren för att skapa en ny App ID, men istĂ€llet för Explicit App ID vĂ€ljer vi Wildcard App ID som pĂ„ skĂ€rmdumpen.

I detta skede Àr vÄrt arbete med developer.apple.com slut, men vi stÀnger inte webblÀsarfönstret. Vi gÄr till och lÀser om verktyget Match frÄn början till slut.
Den uppmÀrksamma lÀsaren har noterat att för att anvÀnda det hÀr verktyget behöver vi ett privat repo och ett konto med Ätkomst till bÄde Apple Developer Program och Github. Vi skapar (om ett sÄdant inte finns) ett konto som InfrastructureAccount@your.company.domain, hittar pÄ ett starkt lösenord, registrerar det pÄ developer.apple.com, och utser det till projektadministratör. DÀrefter ger vi kontot tillgÄng till GitHub-repot för ditt företag och skapar ett nytt privat repository med ett namn som AmazingAppMatch.
3. Konfigurera Fastlane och verktyget match
Ăppna terminalen, gĂ„ till mappen med projektet och initiera fastlane som angivet i . Efter att ha angett kommandot
$ fastlane initkommer du att bli ombedd att vĂ€lja tillgĂ€ngliga konfigurationsalternativ. VĂ€lj den fjĂ€rde punkten â manuell konfiguration av projektet.

Ett nytt bibliotek, fastlane, har dykt upp i projektet, dĂ€r tvĂ„ filer â Appfile och Fastfile â finns. I korthet lagrar vi tjĂ€nstedata i Appfile, och i Fastfile skriver vi in jobb, i Fastlane-terminologin kallade lanes. Jag rekommenderar att lĂ€sa den officiella dokumentationen: , .
Ăppna Appfile i din favorit textredigerare och Ă€ndra den till följande:
app_identifier "com.company.amazingapp" # Bundle ID
apple_dev_portal_id "infrastructureaccount@your.company.domain" # Skapat infrastrukturkonto med rÀttigheter att redigera iOS-projekt i Apple Developer Program.
team_id "LSDY3IFJAY9" # Ditt Developer Portal Team ID
Vi ÄtervÀnder till terminalen och börjar konfigurera match enligt den officiella manualen.
$ fastlane match init
$ fastlane match development
DÀrefter anger vi de begÀrda uppgifterna - repository, konto, lösenord osv.
Viktigt: vid första körningen kommer verktyget match att be om lösenord för att dekryptera repositoryt. Det Àr mycket viktigt att spara detta lösenord, dÄ vi kommer att behöva det vid CI-serverkonfigurationen!
I fastlane-mappen har en ny fil skapats - Matchfile. Ăppna den i din favorittextredigerare och justera den till följande:
git_url("https://github.com/YourCompany/AmazingAppMatch") # Skapat privat repository för att lagra certifikat och profiler.
type("development") # Standardtyp, kan vara: appstore, adhoc, enterprise eller development
app_identifier("com.company.amazingapp")
username("infrastructureaccount@your.company.domain") # Ditt Infrastrukturkonto Apple Developer Portal anvÀndarnamn
Fyller i pÄ detta sÀtt om vi vill anvÀnda match för att signera byggen för distribution till Crashlytics och/eller AppStore, det vill sÀga för att signera bundle ID för din applikation.
Men, som vi minns, för att signera testbygget skapade vi ett speciellt Wildcard ID. SÄ, vi öppnar Fastfile och lÀgger till en ny lane:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # Skapar en separat branch för development certifikatet för signering av testbygget.
)
end
Spara, skriv in i terminalen
fastlane testing_build_for_firebaseoch vi ser hur fastlane har skapat ett nytt certifikat och lagt det i repositoryt. UtmÀrkt!
Ăppna XCode. Nu har vi rĂ€tt provisioning profile av typen Match Development com.company.*, som ska anges i avsnittet Provisioning profile för mĂ„len AmazingApp och AmazingAppUITests.

Det ÄterstÄr att skriva lane för att bygga tester. Vi gÄr till projektet med plugin för fastlane, som underlÀttar konfigurationen för export till Firebase Test Lab och följer instruktionerna.
Kopiera och klistra in frÄn det ursprungliga exemplet, sÄ att vÄr lane testing_build_for_firebase till slut ser ut sÄ hÀr:
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 (we'll get back to this line later)
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
För att fÄ fullstÀndig information om hur man konfigurerar fastlane i CircleCI rekommenderar jag att lÀsa den officiella dokumentationen .
Vi fÄr inte glömma att komplettera vÄr config.yml med en ny uppgift:
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 # uppdatera beroenden
- run:
name: install gcloud-sdk # gcloud mÄste installeras pÄ Mac-datorn
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 # starta lane för byggande och överföring till firebase
4. Vad hÀnder med vÄr testmiljö? Vi stÀller in Firebase.
LÄt oss faktiskt gÄ till det Àmne denna artikel handlar om.
Kanske anvÀnder din app Firebase pÄ en gratisplan, kanske anvÀnder den inte alls. Det spelar ingen roll, för testningsbehov kan vi skapa ett separat projekt med ett Ärs gratistjÀnst (bra, eller hur?)
Logga in pÄ vÄrt infrastrukturella konto (eller nÄgot annat, spelar ingen roll), och gÄ till . Skapa ett nytt projekt med namnet AmazingAppUITests.
Viktigt: I föregÄende steg i Fastfile ska parametern gcp_project i lane firebase_test_lab_ios_xctest motsvara projektets namn.

De förvalda instÀllningarna passar oss bra.
StĂ€ng inte fliken, registrera dig med samma konto i â det Ă€r en tvingad Ă„tgĂ€rd, eftersom kommunikationen med Firebase sker via gcloud-konsolens grĂ€nssnitt.
Google erbjuder 300 $ per Är, vilket i sammanhanget av automatisk testning motsvarar ett Är gratis anvÀndning av tjÀnsten. Vi anger betalningsuppgifter, vÀntar pÄ en testdebitering pÄ 1 $ och fÄr 300 $ pÄ kontot. Efter ett Är kommer projektet automatiskt att övergÄ till en gratis prissÀttningsplan, sÄ vi behöver inte oroa oss för eventuell förlust av pengar.
Vi Ă„tervĂ€nder till fliken med Firebase-projektet och uppgraderar det till prissĂ€ttningsplanen Blaze â nu har vi nĂ„got att betala med om vi överskrider grĂ€nsen.
I gcloud-grÀnssnittet vÀljer vi vÄrt Firebase-projekt, klickar pÄ huvudmenyn "Katalog" och lÀgger till Cloud Testing API och Cloud Tools Result API.

Vi gÄr sedan till menyn "IAM och administration" -> Servicekonton -> Skapa servicekonto. Vi ger redigeringsrÀttigheter för projektet.

Vi skapar en API-nyckel i JSON-format.

Den nedladdade JSON-filen kommer vi att behöva senare, sÄ vi anser att instÀllningen av Test Lab Àr avslutad för nu.
5. Konfigurering av CircleCI
En rimlig frĂ„ga uppstĂ„r â vad gör vi med lösenorden? För att sĂ€kert lagra vĂ„ra lösenord och annan kĂ€nslig information kan vi anvĂ€nda mekanismen för miljövariabler pĂ„ vĂ„r byggmaskin. I instĂ€llningarna för projektet i CircleCI vĂ€ljer vi Miljövariabler.

Och vi skapar följande variabler:
- nyckel: GOOGLE_APPLICATION_CREDENTIALS
vÀrde: innehÄllet i JSON-filen för servicekontots nyckel frÄn gcloud - nyckel: MATCH_PASSWORD
vÀrde: lösenordet för att dekryptera GitHub-repositoriet med certifikaten - nyckel: FASTLANE_PASSWORD
vÀrde: lösenordet för infrastrukturkontot pÄ Apple Developer Portal
Vi sparar Àndringarna, skapar en PR och skickar den pÄ granskning till vÄr teamledare.
Sammanfattning
Som ett resultat av dessa enkla ÄtgÀrder har vi fÄtt en bra, stabil miljö med möjlighet att spela in video frÄn enhetens skÀrm under testet. I det testexemplet angav jag enhetens modell iPhone X, men farmen erbjuder ett rikt urval av kombinationer av olika modeller och versioner av iOS.
Den andra delen kommer att handla om steg-för-steg-instÀllning av Firebase Test Lab för Android-projekt.
KĂ€lla: habr.com
