Moje ime je Dmitry, radim kao tester u tvrtki
Prije toga sam već isprobao Firebase Test Lab za Android i sve mi se jako svidjelo, pa sam odlučio pokušati staviti iOS testnu infrastrukturu projekta na iste temelje. Morao sam puno guglati i nije sve išlo prvi put, pa sam odlučio napisati članak s uputama za one koji se još bore.
Dakle, ako imate testove korisničkog sučelja na iOS projektu, već danas ih možete pokušati pokrenuti na stvarnim uređajima, ljubazno ustupljeni od strane Good Corporation. Za zainteresirane, dobrodošli u cat.
U priči sam odlučio graditi na nekim početnim podacima – privatnom repozitoriju na GitHubu i CircleCI build sustavu. Naziv aplikacije je AmazingApp, bundleID je com.company.amazingapp. Ove podatke iznosim odmah kako bih smanjio naknadnu zabunu.
Ako ste neka rješenja u svom projektu implementirali drugačije, podijelite svoje iskustvo u komentarima.
1. Sami testovi
Stvorite novu granu projekta za UI testove:
$ git checkout develop
$ git pull
$ git checkout -b “feature/add-ui-tests”
Otvorimo projekt u XCodeu i stvorimo novi Target s UI testovima [XCode -> File -> New -> Target -> iOS Testing Bundle], dajući mu samorazumljiv naziv AmazingAppUITests.
Idite na odjeljak Build Phases kreiranog cilja i provjerite prisutnost ciljnih ovisnosti - AmazingApp, u Compile Sources - AmazingAppUITests.swift.
Dobra praksa je odvojiti različite opcije izgradnje u zasebne sheme. Mi stvaramo shemu za naše UI testove [XCode -> Product -> Scheme -> New Scheme] i dajemo joj isti naziv: AmazingAppUITests.
Izrada izrađene sheme mora uključivati Cilj glavne aplikacije - AmazingApp i Target UI testove - AmazingAppUITests - pogledajte snimak zaslona
Zatim stvaramo novu konfiguraciju građenja za testove korisničkog sučelja. U XCodeu kliknite datoteku projekta i idite na odjeljak Info. Kliknite na “+” i izradite novu konfiguraciju, na primjer XCtest. Ovo će nam trebati u budućnosti kako bismo izbjegli ples uz tamburu kada je u pitanju potpisivanje šifre.
Postoje najmanje tri cilja u vašem projektu: glavna aplikacija, jedinični testovi (uostalom, oni postoje, zar ne?) i Target UI testovi koje smo izradili.
Idite na Target AmazingApp, karticu Postavke izrade, odjeljak Identitet potpisivanja koda. Za konfiguraciju XCtest odaberite iOS Developer. U odjeljku Stil potpisivanja koda odaberite Ručno. Još nismo generirali profil za pružanje usluga, ali ćemo mu se svakako vratiti malo kasnije.
Za Target AmazingAppUITests radimo isto, ali u stupac Product Bundle Identifier unosimo com.company.amazingappuitests.
2. Postavljanje projekta u Apple Developer Program
Idite na stranicu Apple Developer Program, idite na odjeljak Certifikati, identifikatori i profili, a zatim na stupac App IDs stavke Identifiers. Izradite novi ID aplikacije pod nazivom AmazingAppUITests i bundleID com.company.amazingappuitests.
Sada imamo priliku potpisati naše testove posebnim certifikatom, ali... Procedura sastavljanja međugradnje za testiranje uključuje sastavljanje same aplikacije i sastavljanje pokretača testa. Sukladno tome, suočeni smo s problemom potpisivanja dva ID-a paketa s jednim profilom za pružanje usluga. Srećom, postoji jednostavno i elegantno rješenje - Wildcard App ID. Ponavljamo proceduru za izradu novog App ID-a, ali umjesto Explicit App ID-a biramo Wildcard App ID kao na snimci zaslona.
U ovom smo trenutku završili s radom s developer.apple.com, ali nećemo minimizirati prozor preglednika. Idemo
Pažljivi čitatelj primijetio je da će nam za korištenje ovog uslužnog programa trebati privatno spremište i račun s pristupom Apple Developer Programu i Githubu. Stvaramo (ako iznenada toga nema) račun obrasca [e-pošta zaštićena], smislite jaku lozinku, registrirajte je na developer.apple.com i postavite je kao administratora projekta. Zatim dajemo računu pristup github repozitoriju vaše tvrtke i stvaramo novi privatni repozitorij s nazivom poput AmazingAppMatch.
3. Postavljanje Fastlanea i pomoćnog programa za meč
Otvorite terminal, idite u mapu s projektom i inicijalizirajte fastlane kao što je navedeno u
$ fastlane init
Od vas će se tražiti da odaberete dostupne konfiguracije korištenja. Odaberite četvrtu opciju - ručno postavljanje projekta.
Projekt ima novi direktorij fastlane, koji sadrži dvije datoteke - Appfile i Fastfile. Ukratko, pohranjujemo podatke o uslugama u Appfileu i pišemo poslove u Fastfileu, koji se u terminologiji Fastlanea nazivaju staze. Preporučujem čitanje službene dokumentacije:
Otvorite Appfile u svom omiljenom uređivaču teksta i dovedite ga u sljedeći obrazac:
app_identifier "com.company.amazingapp" # Bundle ID
apple_dev_portal_id "[email protected]" # Созданный инфраструктурный аккаунт, имеющий право на редактирование iOS проекта в Apple Developer Program.
team_id "LSDY3IFJAY9" # Your Developer Portal Team ID
Vraćamo se na terminal i prema službenom priručniku počinjemo konfigurirati utakmicu.
$ fastlane match init
$ fastlane match development
Zatim unesite tražene podatke - repozitorij, račun, lozinku itd.
Važno: Kada prvi put pokrenete uslužni program za podudaranje, od vas će se tražiti da unesete lozinku za dešifriranje repozitorija. Vrlo je važno sačuvati ovu lozinku; trebat će nam prilikom postavljanja CI poslužitelja!
Nova datoteka se pojavila u fastlane mapi - Matchfile. Otvorite ga u svom omiljenom uređivaču teksta i prikažite ga ovako:
git_url("https://github.com/YourCompany/AmazingAppMatch") #Созданный приватный репозиторий для хранения сертификатов и профайлов.
type("development") # The default type, can be: appstore, adhoc, enterprise or development
app_identifier("com.company.amazingapp")
username("[email protected]") # Your Infrastructure account Apple Developer Portal username
Ispunjavamo ga upravo na ovaj način ako ubuduće želimo koristiti match za potpisivanje buildova za objavu u Crashlyticsu i/ili AppStoreu, odnosno za potpisivanje bundle ID-a vaše aplikacije.
No, kao što se sjećamo, stvorili smo poseban ID zamjenskog znaka za potpisivanje testne verzije. Stoga otvorite Fastfile i unesite novu traku:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # создаем отдельный бранч для development сертификата для подписи тестовой сборки.
)
end
Spremite i uđite u terminal
fastlane testing_build_for_firebase
i vidimo kako je fastlane stvorio novi certifikat i stavio ga u repozitorij. Sjajno!
Otvorite XCode. Sada imamo potreban profil pružanja obrasca Match Development com.company.*, koji mora biti naveden u odjeljku Profil pružanja za ciljeve AmazingApp i AmazingAppUITests.
Ostaje dodati traku za sastavljanje testova. Idemo
Kopirajmo i zalijepimo iz originalnog primjera tako da naš lane testing_build_for_firebase na kraju izgleda ovako:
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 (к этой строчке вернемся позже)
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
Za potpune informacije o postavljanju fastlanea u CircleCI, preporučujem čitanje službene dokumentacije
Ne zaboravite dodati novi zadatak u naš config.yml:
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 # обновляем зависимости
- run:
name: install gcloud-sdk # на mac машину необходимо установить gcloud
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 # запускаем lane сборки и отправки в firebase
4. Što je s našim ispitnim stolom? Postavljanje Firebasea.
Prijeđimo na ono za što je članak napisan.
Možda vaša aplikacija koristi Firebase na besplatnom planu ili možda uopće ne koristi. Nema apsolutno nikakve fundamentalne razlike, jer za potrebe testiranja možemo napraviti zaseban projekt s godinu dana besplatnog korištenja (cool, zar ne?)
Prijavljujemo se na svoj infrastrukturni račun (ili bilo koji drugi, nije važno) i idemo na
Važno: U prethodnom koraku u Fastfileu u traci firebase_test_lab_ios_xctest parametar gcp_project trebao bi odgovarati nazivu projekta.
Zadane postavke nam sasvim dobro odgovaraju.
Ne zatvarajte karticu, registrirajte se pod istim računom u
Google daje 300 dolara za godinu dana, što je u kontekstu izvođenja autotestova ekvivalentno godini besplatnog korištenja usluge. Unosimo vaše podatke o plaćanju, čekamo testno terećenje od 1 USD i primamo 300 USD na vaš račun. Nakon godinu dana projekt će automatski biti prebačen na besplatni tarifni plan, tako da nema razloga za brigu o mogućem gubitku novca.
Vratimo se na karticu s projektom Firebase i prebacimo ga na tarifni plan Blaze - sada imamo što platiti ako se prekorači limit.
U sučelju gcloud odaberite naš Firebase projekt, odaberite stavku glavnog izbornika "Directory" i dodajte Cloud Testing API i Cloud Tools Result API.
Zatim idite na stavku izbornika “IAM i administracija” -> Računi usluga -> Stvori račun usluge. Dajemo pravo na uređivanje projekta.
Izradite API ključ u JSON formatu
Preuzeti JSON trebat ćemo malo kasnije, ali za sada ćemo smatrati da je postavljanje Test Laba završeno.
5. Postavljanje CircleCI
Postavlja se razumno pitanje - što učiniti s lozinkama? Mehanizam varijable okruženja našeg stroja za izradu pomoći će nam da sigurno pohranimo svoje lozinke i druge osjetljive podatke. U postavkama projekta CircleCI odaberite Varijable okoline
I postavite sljedeće varijable:
- ključ: GOOGLE_APPLICATION_CREDENTIALS
vrijednost: sadržaj json datoteke ključa računa usluge gcloud - ključ: MATCH_PASSWORD
vrijednost: lozinka za dekriptiranje github repozitorija s certifikatima - ključ: FASTLANE_PASSWORD
vrijednost: zaporka računa infrastrukture Apple Developer Portala
Spremamo promjene, stvaramo PR i šaljemo ga našem voditelju tima na pregled.
Rezultati
Kao rezultat ovih jednostavnih manipulacija dobili smo dobar, stabilan radni stalak s mogućnošću snimanja videa na zaslonu uređaja u vrijeme testiranja. U testnom primjeru naveo sam model iPhone X uređaja, ali farma nudi bogat izbor iz kombinacije različitih modela i iOS verzija.
Drugi dio bit će posvećen korak-po-korak postavljanju Firebase Test Laba za Android projekt.
Izvor: www.habr.com