
MĂ« quajnĂ« Dmitrij, punoj si tester nĂ« kompaninĂ« . PĂ«rsĂ«ritej pĂ«r tĂ« pĂ«rfunduar njĂ« veçori relativisht tĂ« re nga â dhe konkretisht, pĂ«r testimin e instrumenteve tĂ« aplikacioneve iOS duke pĂ«rdorur kuadrin natyror tĂ« testimit XCUITest.
Para kësaj, kam provuar Firebase Test Lab për Android dhe m'u pëlqeu shumë, kështu që vendosa të provoj të vendos një infrastrukturë testimi për projektin iOS në të njëjtën linjë. Më duhej të kërkoja shumë dhe nuk munda gjithmonë të arrija që në herën e parë, prandaj vendosa të shkruaj një artikull/tutorial për ata që ende kanë për të bërë këtë.
Pra, nĂ«se keni teste UI nĂ« projektin tuaj iOS, do tĂ« mund tĂ« provoni t'i запŃŃĐșĐ°ĐœĐ°Ńizoni sot nĂ« pajisje reale, tĂ« ofruara mirĂ«sisht nga Korporata e MirĂ«sisĂ«. TĂ« interesuarit â mirĂ«sevini poshtĂ«.
NĂ« narrativĂ« vendosa tĂ« basoja disa tĂ« dhĂ«na fillestare â njĂ« depo private nĂ« GitHub dhe njĂ« sistem ndĂ«rtimi CircleCI. Emri i aplikacionit Ă«shtĂ« AmazingApp, bundleID Ă«shtĂ« com.company.amazingapp. KĂ«to tĂ« dhĂ«na i jap menjĂ«herĂ«, pĂ«r tĂ« zvogĂ«luar konfuzionin e mĂ«vonshĂ«m.
Nëse keni implementuar ndonjë zgjidhje tjetër në projektin tuaj, ndani përvojën tuaj në komente.
1. Të testet vetë
Krijojmë një degë të re të projektit për testet UI:
$ git checkout develop
$ git pull
$ git checkout -b "feature/add-ui-tests"
Hapim projektin në XCode dhe krijojmë një qëllim të ri (Target) për testet UI [XCode -> File -> New -> Target -> iOS Testing Bundle], duke i dhënë një emër përkatës AmazingAppUITests.

KalojmĂ« nĂ« seksionin Build Phases tĂ« Target-it tĂ« krijuar dhe kontrollojmĂ« praninĂ« e Target Dependencies â AmazingApp, nĂ« Compile Sources â AmazingAppUITests.swift.
Një praktikë e mirë është ndarja e varianteve të ndryshme të ndërtimit në skema të veçanta (Schemes). Krijojmë një skemë për testet tona UI [XCode -> Product -> Scheme -> New Scheme] dhe i japim të njëjtin emër: AmazingAppUITests.
Build-i i skemĂ«s sĂ« krijuar duhet tĂ« pĂ«rfshijĂ« Target-in e aplikacionit kryesor â AmazingApp dhe Target-in e testeve UI â AmazingAppUITests â shihni screenshot-in.

Më pas, krijojmë një konfigurim të ri të ndërtimit për testet UI. Në XCode klikoni në skedarin e projektit, kaloni në seksionin Info. Klikoni në '+' dhe krijoni një konfigurim të ri, për shembull XCtest. Kjo do të na nevojitet më vonë, për të shmangur ndonjë problem kur të arrijmë në nënshkrimin e kodit.

Në projektin tuaj, ka të paktën tri Target: aplikacionin kryesor, testet e njësisë (ato ekzistojnë, apo jo?) dhe Targetin UI të testeve që krijuam ne.
Hyni në Target AmazingApp, në tabin Build Settings, ndahen Code Signing Identity. Për konfigurimin e XCtest, zgjidhni iOS Developer. Në seksionin Code Signing Style, zgjidhni Manual. Profilin e mundësimit ende nuk e kemi gjeneruar, por do të kthehemi tek ai më vonë.
Për Target AmazingAppUITests bëjmë të njëjtën gjë, por në fushën Product Bundle Identifier shkruajmë com.company.amazingappuitests.
2. Konfigurimi i projektit në Apple Developer Program
Hyni në faqen e Apple Developer Program, kaloni në seksionin Certificates, Identifiers & Profiles dhe pastaj në fushën App IDs të seksionit Identifiers. Krijoni një App ID të ri me emrin AmazingAppUITests dhe bundleID com.company.amazingappuitests.

Tani kemi mundĂ«sinĂ« tĂ« nĂ«nshkruajmĂ« testet tona me njĂ« certifikatĂ« tĂ« veçantĂ«, por⊠Procedura e ndĂ«rtimit tĂ« build-it pĂ«r testim nĂ«nkupton ndĂ«rtimin e aplikacionit tĂ« vetĂ« dhe ndĂ«rtimin e testit tĂ« runnerit. PĂ«r rrjedhojĂ«, hasim njĂ« problem nĂ«nshkrimi tĂ« dy bundle ID me njĂ« provisioning profile. FatmirĂ«sisht, ekziston njĂ« zgjidhje e thjeshtĂ« dhe elegante â Wildcard App ID. PĂ«rsĂ«ritni procedurĂ«n e krijimit tĂ« njĂ« App ID tĂ« ri, por nĂ« vend tĂ« Explicit App ID, zgjidhni Wildcard App ID siç shfaqet nĂ« screenshot.

Në këtë hap punën me developer.apple.com e kemi përfunduar, por nuk do ta mbyllim dritaren e shfletuesit. Shkoi te dhe lexo për utilitarin Match nga fillimi deri në fund.
Një lexues i kujdesshëm ka vënë re se për të përdorur këtë utilitar na nevojitet një depo private dhe një llogari me akses si për Apple Developer Program, ashtu edhe për Github. Krijohet (nëse nuk ekziston) llogaria e tipit InfrastructureAccount@your.company.domain, shpikim një fjalëkalim të fortë, e regjistrojmë në developer.apple.com, dhe e emërojmë administrator projekti. Më pas, i japim llogarisë aksesi në depozitën github të kompanisë tuaj dhe krijojmë një depo të re private me emrin si AmazingAppMatch.
3. Konfigurimi i Fastlane dhe utilitarit match
Hapim terminalin, kalojmë në folderin e projektit dhe e inicializojmë fastlane siç është e shënuar në . Pas futjes së komandës
$ fastlane initdo tĂ« ofrohet tĂ« zgjidhni konfigurimet nĂ« dispozicion pĂ«r pĂ«rdorim. Zgjidhni opsionin e katĂ«rt â konfigurimin manual tĂ« projektit.

NĂ« projektin tonĂ« ka njĂ« direktor tĂ« ri fastlane, ku ndodhen dy skedarĂ« â Appfile dhe Fastfile. NĂ« dy fjalĂ« â nĂ« Appfile ruajmĂ« tĂ« dhĂ«na shĂ«rbimi, ndĂ«rsa nĂ« Fastfile pĂ«rshkruajmĂ« punĂ«t, tĂ« njohura si lanes nĂ« terminologjinĂ« Fastlane. Rekomandoj leximin e dokumentacionit zyrtar: , .
Hapni Appfile në edituesin tuaj të preferuar të tekstit dhe sillni në këtë formë:
app_identifier "com.company.amazingapp" # Bundle ID
apple_dev_portal_id "infrastructureaccount@your.company.domain" # Llogaria infrastrukturore e krijuar, e cila ka të drejtë të editojë projektin iOS në Programin e Zhvilluesve të Apple.
team_id "LSDY3IFJAY9" # Identifikuesi i ekipit tuaj në Portalin e Zhvilluesve
Kthehemi në terminal dhe sipas manualit zyrtar fillojmë konfigurimin e match.
$ fastlane match init
$ fastlane match development
MĂ« pas, shtypni tĂ« dhĂ«nat e kĂ«rkuara â depo, llogari, fjalĂ«kalim etj.
E rĂ«ndĂ«sishme: nĂ« ekzekutimin e parĂ«, utilitari match do tĂ« kĂ«rkojĂ« tĂ« futni fjalĂ«kalimin pĂ«r dekriptimin e depozitĂ«s. ĂshtĂ« shumĂ« e rĂ«ndĂ«sishme tĂ« ruani kĂ«tĂ« fjalĂ«kalim, pasi do tĂ« na nevojitet nĂ« fazĂ«n e konfigurimit tĂ« serverit CI!
NĂ« dosjen fastlane Ă«shtĂ« shfaqur njĂ« skedar i ri â Matchfile. Hapeni nĂ« edituesin tuaj tĂ« preferuar tĂ« tekstit dhe sillni nĂ« kĂ«tĂ« formĂ«:
git_url("https://github.com/YourCompany/AmazingAppMatch") #Repoziori privat i krijuar për ruajtjen e certifikatave dhe profileve.
type("development") # Lloji standard, mund të jetë: appstore, adhoc, enterprise ose development
app_identifier("com.company.amazingapp")
username("infrastructureaccount@your.company.domain") # Emri i përdoruesit tuaj në Portalin e Zhvilluesve Apple të llogarisë së Infrastrukturës
E plotësojmë në këtë mënyrë, nëse duam më pas të përdorim match për nënshkrimin e ndërtimeve për publikimin në Crashlytics dhe/ose AppStore, pra për nënshkrimin e bundle ID të aplikacionit tuaj.
Por, siç e kujtojmë, për nënshkrimin e ndërtimit të testit krijuam një Wildcard ID të veçantë. Prandaj, hapim Fastfile dhe shkruajmë lane të re.
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # krijojmë një branched të veçantë për certifikatën development për nënshkrimin e ndërtimit të testit.
)
end
E ruajmë, e shkruajmë në terminal
fastlane testing_build_for_firebasedhe shohim si fastlane krijoi një certifikatë të re dhe e vendosi atë në repository. Shkëlqyer!
Hapim XCode. Tani kemi profilin e nevojshëm të provisioning të llojit Match Development com.company.*, që duhet të tregojmë në seksionin Provisioning profile për targetet AmazingApp dhe AmazingAppUITests.

Na mbetet të shtojmë lane për ndërtimin e testeve. Shkojmë në projekti i plugin-it për fastlane që lehtëson konfigurimin e eksportit në Firebase Test Lab dhe ndjekim udhëzimet.
Kopjojme nga shembulli burimor, që të duket lane testing_build_for_firebase ashtu siç duhet:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests"
)
scan(
scheme: 'AmazingAppUITests', # Schemi e testit UI
clean: true, # E rekomanduar: Kjo do të sigurojë që ndërtimi të mos përfshijë skedarë të panevojshëm
skip_detect_devices: true, # E nevojshme
build_for_testing: true, # E nevojshme
sdk: 'iphoneos', # E nevojshme
should_zip_build_products: true, # Duhet të jetë e vërtetë për të vendosur formatin e duhur për Firebase Test Lab
)
firebase_test_lab_ios_xctest(
gcp_project: 'AmazingAppUITests', # Emri i projektit tuaj në Google Cloud (këtë varg do ta rikthejmë më vonë)
devices: [ # Pajisjet për të cilat do të kryhen testet
{
ios_model_id: 'iphonex', # ID e modelit të pajisjes, shih komandën gcloud më sipër
ios_version_id: '12.0', # ID e versions iOS, shih komandën gcloud më sipër
locale: 'en_US', # Opsionale: parazgjedhje në en_US nëse nuk është caktuar
orientation: 'portrait' # Opsionale: parazgjedhje në portret nëse nuk është caktuar
}
]
)
end
Për informacion të plotë mbi konfigurimin e fastlane në CircleCI, rekomandoj leximin e dokumentacionit zyrtar. .
Mos harro të shtosh një detyrë të re në config.yml tonë:
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 # përditësojmë varësitë
- run:
name: instaloni gcloud-sdk # për makinën mac nevojitet të instalohet gcloud
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: ndërtimi i aplikacionit për testim
command: fastlane testing_build_for_firebase # fillojmë rrugën e ndërtimit dhe dërgimit në firebase
4. Si për qëndron testimi ynë? Konfiguroni Firebase.
Le të kalojmë në atë për çfarë është shkruar ky artikull.
Ndoshta aplikacioni juaj përdor Firebase në planin e lirë, ndoshta as nuk e përdor. Nuk ka asnjë ndryshim thelbësor, sepse për nevojat e testimit mund të krijojmë një projekt të veçantë me një vit përdorimi falas (e shkëlqyer, apo jo?)
Bashkohuni në llogarinë tonë të infrastrukturës (apo ndonjë tjetër, nuk ka rëndësi) dhe shkojmë në . Krijojmë një projekt të ri me emrin AmazingAppUITests.
E rëndësishme: Në hapin e mëparshëm në Fastfile në rrugën firebase_test_lab_ios_xctest, parametri gcp_project duhet të përputhet me emrin e projektit.

Cilësimet e parazgjedhura na përshtaten mjaft mirë.
Nuk e mbyllim skedĂ«n, regjistrohemi me tĂ« njĂ«jtin llogari nĂ« â kjo Ă«shtĂ« njĂ« masĂ« e detyruar, pasi komunikimi me Firebase ndodh pĂ«rmes ndĂ«rfaqes sĂ« konsolĂ«s gcloud.
Google dhuron 300$ për një vit, që në kontekstin e ekzekutimit të testeve automatike është ekuivalente me një vit përdorim falas të shërbimit. Futni të dhënat e pagesës, prisni një zbritje testuese prej 1$ dhe merrni 300$ në llogari. Pasi të kalojë viti, projekti do të kalojë automatikisht në planin falas, kështu që nuk ka nevojë për t'u shqetësuar për një humbje të mundshme parash.
TĂ« kthehemi nĂ« skedĂ«n me projektin Firebase dhe ta kalojmĂ« atĂ« nĂ« planin Blaze â tani kemi me çfarĂ« tĂ« paguajmĂ« nĂ« rast se kalojmĂ« kufirin.
Në ndërfaqen e gcloud, zgjedhim projektin tonë Firebase, zgjedhim opsionin e menytë kryesore "Katalogu" dhe shtojmë Cloud Testing API dhe Cloud Tools Result API.

Më pas kalojmë në opsionin e menytë "IAM dhe administrimin" -> Llogaritë e shërbimeve -> Krijo një llogari shërbimi. I japim të drejtat për të redaktuar projektin.

Krijojmë një çelës API në formatin JSON

JSON që kemi shkarkuar do na nevojitet pak më vonë, ndërsa tani konfigurimi i Test Lab mbetet i përfunduar.
5. Konfigurimi i CircleCI
ShqetĂ«simi i arsyeshĂ«m lind â çfarĂ« duhet tĂ« bĂ«jmĂ« me fjalĂ«kalimet? Mjekimi pĂ«r ruajtjen e sigurt tĂ« fjalĂ«kalimeve tona dhe tĂ« dhĂ«nave tĂ« tjera tĂ« ndjeshme na ndihmon mekanizmi i variablave tĂ« mjedisit nĂ« makinĂ«n tonĂ« tĂ« ndĂ«rtimit. NĂ« cilĂ«simet e projektit nĂ« CircleCI, zgjedhim Variablat e Mjedisit

Dhe krijojmë variablat e mëposhtëm:
- çelësi: GOOGLE_APPLICATION_CREDENTIALS
vlera: përmbajtja e skedarit json të çelësit të llogarisë së shërbimit gcloud - çelësi: MATCH_PASSWORD
vlera: fjalëkalimi për dekriptimin e depozitës github me certifikatat - çelësi: FASTLANE_PASSWORD
vlera: fjalëkalimi i llogarisë infrastrukturore në Apple Developer Portal
Ruajmë ndryshimet, krijojmë PR dhe e dërgojmë për rishikim te timlidi ynë.
Përfundimet
Si rezultat i këtyre manipulimeve të thjeshta, ne morëm një skenë të mirë, të qëndrueshme me mundësinë për të regjistruar video në ekranin e pajisjes ndërsa mbahet testi. Në shembullin e testit tregova modelin e pajisjes iPhone X, por ferma ofron një zgjedhje të pasur të kombinimeve të modeleve të ndryshme dhe versioneve të iOS.
Pjesa e dytë do të jetë e dedikuar për konfigurimin hap pas hapi të Firebase Test Lab për projektin Android.
Burimi: habr.com
