
Zovem se Dmitrij, radim kao tester u kompaniji . Nedavno sam završio sa radom sa relativno nedavnom funkcijom iz — naime, uz instrumentalno testiranje iOS aplikacija korištenjem izvornog okvira za testiranje XCUITest.
Prije ovoga, već sam isprobao Firebase Test Lab za Android Zaista mi se svidjelo, pa sam odlučio pokušati postaviti testnu infrastrukturu iOS projekta na istoj stazi. Morao sam puno guglati i nije sve uspjelo iz prvog pokušaja, pa sam odlučio napisati tutorijal za one koji još uvijek pokušavaju.
Dakle, ako imate UI testove na iOS projektu, već danas možete pokušati da ih pokrenete na stvarnim uređajima, ljubazno osigurana od strane Good Corporation. Za zainteresovane, dobrodošli u cat.
U priči sam odlučio da izgradim neke početne podatke - privatno spremište na GitHubu i CircleCI build sistem. Naziv aplikacije je AmazingApp, bundleID je com.company.amazingapp. Iznosim ove podatke odmah kako bih smanjio kasniju zabunu.
Ako ste različito implementirali određena rješenja u svoj projekt, podijelite svoje iskustvo u komentarima.
1. Sami testovi
Kreirajte novu granu projekta za UI testove:
$ git checkout develop
$ git pull
$ git checkout -b “feature/add-ui-tests”
Otvorimo projekat u XCode-u i kreirajmo novi Target sa UI testovima [XCode -> File -> New -> Target -> iOS Testing Bundle], dajući mu naziv AmazingAppUITests koji je samo po sebi razumljiv.

Idite na odjeljak Faze izgradnje kreiranog Target-a i provjerite prisutnost Target Dependencies - AmazingApp, u Compile Sources - AmazingAppUITests.swift.
Dobra praksa je odvajanje različitih opcija izgradnje u zasebne šeme. Kreiramo šemu za naše UI testove [XCode -> Product -> Scheme -> New Scheme] i dajemo joj isto ime: AmazingAppUITests.
Izrada kreirane šeme mora uključivati Target glavne aplikacije - AmazingApp i Target UI testove - AmazingAppUITests - pogledajte snimak ekrana

Zatim kreiramo novu konfiguraciju izgradnje za UI testove. U XCodeu kliknite na datoteku projekta i idite na odjeljak Info. Kliknite na “+” i kreirajte novu konfiguraciju, na primjer XCtest. Ovo će nam trebati u budućnosti kako bismo izbjegli ples s tamburom kada je u pitanju potpisivanje koda.

U vašem projektu postoje najmanje tri cilja: glavna aplikacija, jedinični testovi (na kraju krajeva, postoje, zar ne?) i Target UI testovi koje smo kreirali.
Idite na Target AmazingApp, karticu Postavke izrade, odjeljak Identitet za potpisivanje koda. Za XCtest konfiguraciju odaberite iOS Developer. U odjeljku Stil potpisivanja koda odaberite Ručno. Još nismo generirali profil za proviziju, ali ćemo se definitivno vratiti na njega malo kasnije.
Za Target AmazingAppUITests radimo isto, ali u kolonu Product Bundle Identifier unosimo com.company.amazingappuitests.
2. Postavljanje projekta u Apple Developer Program
Idite na stranicu programa Apple Developer Program, idite na odjeljak Certifikati, identifikatori i profili, a zatim na kolonu ID-ovi aplikacije u stavci Identifikatori. Kreirajte novi ID aplikacije pod nazivom AmazingAppUITests i bundleID com.company.amazingappuitests.

Sada imamo priliku da svoje testove potpisujemo posebnim sertifikatom, ali... Procedura sastavljanja build-a za testiranje uključuje sklapanje same aplikacije i sastavljanje test runnera. Shodno tome, suočeni smo sa problemom potpisivanja dva ID-a paketa sa jednim provizijskim profilom. Srećom, postoji jednostavno i elegantno rješenje - Wildcard App ID. Ponavljamo proceduru za kreiranje novog ID-a aplikacije, ali umjesto Eksplicitnog ID-a aplikacije, odaberite Wildcard ID aplikacije kao na snimku ekrana.

U ovom trenutku smo završili rad sa developer.apple.com, ali nećemo minimizirati prozor pretraživača. Idemo na i pročitajte o uslužnom programu Match od korice do korice.
Pažljivi čitatelj će primijetiti da će nam za korištenje ovog uslužnog programa biti potrebno privatno spremište i račun s pristupom Apple Developer Programu i Githubu. Kreiramo (ako ga odjednom nema) nalog tipa InfrastructureAccount@your.company.domain, smislimo jaku lozinku, registrujemo ga na developer.apple.com i imenujemo ga za administratora projekta. Zatim dajte nalogu pristup github repozitorijumu vaše kompanije i kreirajte novo privatno spremište sa imenom kao što je AmazingAppMatch.
3. Postavljanje Fastlane-a i uslužnog programa za utakmicu
Otvorite terminal, idite u fasciklu sa projektom i inicijalizirajte fastlane kao što je naznačeno u . Nakon unosa komande
$ fastlane initOd vas će biti zatraženo da odaberete dostupne konfiguracije korištenja. Odaberite četvrtu opciju - ručno podešavanje projekta.

Projekat ima novi direktorij fastlane, koji sadrži dvije datoteke - Appfile i Fastfile. Ukratko, pohranjujemo servisne podatke u Appfile, a poslove pišemo u Fastfile, koji se nazivaju trake u Fastlane terminologiji. Preporučujem da pročitate zvaničnu dokumentaciju: , .
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 "infrastructureaccount@your.company.domain" # Созданный инфраструктурный аккаунт, имеющий право на редактирование 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 - spremište, račun, lozinku, itd.
Važno je da se: Kada prvi put pokrenete uslužni program za podudaranje, od vas će se tražiti da unesete lozinku za dešifriranje spremišta. Veoma je važno da sačuvamo ovu lozinku;
Nova datoteka se pojavila u fascikli fastlane - 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("infrastructureaccount@your.company.domain") # Your Infrastructure account Apple Developer Portal username
Popunjavamo ga upravo na ovaj način ako želimo koristiti match u budućnosti za potpisivanje build-ova za prikaz u Crashlytics i/ili AppStore-u, odnosno za potpisivanje bundle ID-a vaše aplikacije.
Ali, kao što se sjećamo, kreirali smo poseban Wildcard ID za potpisivanje probne verzije. Stoga, otvorite Fastfile i uđite u novu traku:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # создаем отдельный бранч для development сертификата для подписи тестовой сборки.
)
end
Sačuvajte i uđite u terminal
fastlane testing_build_for_firebasei vidimo kako je fastlane kreirao novi certifikat i stavio ga u spremište. Odlično!
Otvorite XCode. Sada imamo neophodan profil obezbeđivanja obrasca Match Development com.company.*, koji mora biti naveden u odeljku Profil provizije za ciljeve AmazingApp i AmazingAppUITests.

Ostaje dodati traku za testove sastavljanja. Idemo na projekat dodataka za fastlane koji olakšava postavljanje izvoza u Firebase Test Lab i slijedite upute.
Kopirajmo i zalijepimo iz originalnog primjera tako da naš lane testing_build_for_firebase 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. Šta je sa našom ispitnom klupom? Postavljanje Firebase-a.
Pređimo na ono zbog čega je članak napisan.
Možda vaša aplikacija koristi Firebase na besplatnom planu, a možda uopće ne koristi. Apsolutno nema suštinske razlike, jer za potrebe testiranja možemo napraviti poseban projekat sa godinu dana besplatnog korišćenja (kul, zar ne?)
Prijavljujemo se na naš infrastrukturni račun (ili bilo koji drugi, nije važno) i idemo na . Kreirajte novi projekat pod nazivom AmazingAppUITests.
Važno je da se: U prethodnom koraku u Fastfileu u traci firebase_test_lab_ios_xctest parametar gcp_project bi trebao odgovarati imenu projekta.

Zadane postavke nam dosta odgovaraju.
Ne zatvarajte karticu, registrujte se pod istim nalogom u - ovo je neophodna mjera, budući da se komunikacija sa Firebase-om odvija preko sučelja gcloud konzole.
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 probno zaduženje od 1 USD i primamo 300 USD na vaš račun. Nakon godinu dana, projekat će automatski biti prebačen na besplatni tarifni plan, tako da nema potrebe da brinete o mogućem gubitku novca.
Vratimo se na karticu sa Firebase projektom i prebacimo ga na Blaze tarifni plan - sada imamo šta platiti ako se limit prekorači.
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 menija “IAM i administracija” -> Servisni nalozi -> Kreiraj nalog usluge. Dajemo prava za uređivanje projekta.

Kreirajte API ključ u JSON formatu

Preuzeti JSON će nam trebati malo kasnije, ali za sada ćemo smatrati da je podešavanje Test Lab-a završeno.
5. Postavljanje CircleCI
Postavlja se razumno pitanje - šta učiniti sa lozinkama? Mehanizam varijabli okruženja naše mašine za izradu pomoći će nam da bezbedno čuvamo naše lozinke i druge osetljive podatke. U postavkama projekta CircleCI izaberite Varijable okruženja

I postavite sljedeće varijable:
- ključ: GOOGLE_APPLICATION_CREDENTIALS
vrijednost: sadržaj json datoteke ključa naloga usluge gcloud - ključ: MATCH_PASSWORD
vrijednost: lozinka za dešifriranje github spremišta s certifikatima - ključ: FASTLANE_PASSWORD
vrijednost: Lozinka naloga infrastrukture Apple Developer Portala
Mi spremamo promjene, kreiramo PR i šaljemo ga našem vođi tima na pregled.
Ishodi
Kao rezultat ovih jednostavnih manipulacija, dobili smo dobru, stabilnu konfiguraciju sa mogućnošću snimanja videa na ekranu uređaja tokom testiranja. U testnom primjeru sam naveo model uređaja. iPhone X, ali farma nudi bogat izbor kombinacija različitih modela i iOS verzija.
Drugi dio će biti posvećen korak-po-korak postavljanju Firebase Test Laba za Android projekat.
izvor: www.habr.com
