Jmenuji se Dmitry a pracuji jako tester ve firmě
Předtím jsem již vyzkoušel Firebase Test Lab pro Android a opravdu se mi vše líbilo, takže jsem se rozhodl zkusit postavit testovací infrastrukturu iOS projektu na stejnou úroveň. Musel jsem hodně googlovat a ne všechno se povedlo napoprvé, tak jsem se rozhodl napsat výukový článek pro ty, kteří se stále trápí.
Pokud tedy máte testy uživatelského rozhraní na projektu iOS, můžete si je již dnes vyzkoušet spustit na skutečných zařízeních, laskavě poskytnutých společností Good Corporation. Pro zájemce vítejte na kat.
V příběhu jsem se rozhodl stavět na některých počátečních datech – soukromém repozitáři na GitHubu a sestavovacím systému CircleCI. Název aplikace je AmazingApp, bundleID je com.company.amazingapp. Tyto údaje uvádím okamžitě, abych snížil následný zmatek.
Pokud jste některá řešení ve svém projektu implementovali jinak, podělte se o své zkušenosti v komentářích.
1. Samotné testy
Vytvořte novou větev projektu pro testy uživatelského rozhraní:
$ git checkout develop
$ git pull
$ git checkout -b “feature/add-ui-tests”
Otevřeme projekt v XCode a vytvoříme nový cíl s testy uživatelského rozhraní [XCode -> File -> New -> Target -> iOS Testing Bundle] a dáme mu samovysvětlující název AmazingAppUITests.
Přejděte do sekce Build Phases vytvořeného cíle a zkontrolujte přítomnost Target Dependencies - AmazingApp, v Compile Sources - AmazingAppUITests.swift.
Osvědčeným postupem je oddělit různé možnosti sestavení do samostatných schémat. Vytvoříme schéma pro naše testy uživatelského rozhraní [XCode -> Produkt -> Schéma -> Nové schéma] a dáme mu stejný název: AmazingAppUITests.
Sestavení vytvořeného schématu musí zahrnovat Cíl hlavní aplikace - AmazingApp a Target UI testy - AmazingAppUITests - viz snímek obrazovky
Dále vytvoříme novou konfiguraci sestavení pro testy uživatelského rozhraní. V XCode klikněte na soubor projektu a přejděte do sekce Info. Klikněte na „+“ a vytvořte novou konfiguraci, například XCtest. V budoucnu to budeme potřebovat, abychom se vyhnuli tanci s tamburínou, pokud jde o podepisování kódu.
Ve vašem projektu jsou alespoň tři cíle: hlavní aplikace, testy jednotek (koneckonců existují, že?) a testy cílového uživatelského rozhraní, které jsme vytvořili.
Přejděte do části Target AmazingApp, karta Nastavení sestavení, část Identita podepisování kódu. Pro konfiguraci XCtest vyberte iOS Developer. V části Styl podepisování kódu vyberte Ruční. Provizorní profil jsme zatím nevygenerovali, ale určitě se k němu vrátíme o něco později.
Pro Target AmazingAppUITests děláme totéž, ale do sloupce Product Bundle Identifier zadáme com.company.amazingappuitests.
2. Nastavení projektu v programu Apple Developer Program
Přejděte na stránku Apple Developer Program, přejděte do sekce Certifikáty, identifikátory a profily a poté do sloupce App ID v položce Identifikátory. Vytvořte nové ID aplikace s názvem AmazingAppUITests a bundleID com.company.amazingappuitests.
Nyní máme možnost podepsat naše testy samostatným certifikátem, ale... Postup při sestavení sestavení pro testování zahrnuje sestavení samotné aplikace a sestavení testovacího běhu. V souladu s tím se potýkáme s problémem podepisování dvou ID svazků s jedním zřizovacím profilem. Naštěstí existuje jednoduché a elegantní řešení – Wildcard App ID. Opakujeme postup pro vytvoření nového ID aplikace, ale místo Explicit App ID vyberte Wildcard App ID jako na snímku obrazovky.
V tuto chvíli jsme skončili s prací s developer.apple.com, ale nebudeme minimalizovat okno prohlížeče. Pojďme
Pozorný čtenář si všiml, že k použití tohoto nástroje budeme potřebovat soukromé úložiště a účet s přístupem jak do Apple Developer Program, tak do Github. Vytvoříme (pokud najednou nic takového neexistuje) účet formuláře [chráněno e-mailem], vymyslete silné heslo, zaregistrujte jej na developer.apple.com a jmenujte jej správcem projektu. Dále dáme účtu přístup k úložišti github vaší společnosti a vytvoříme nové soukromé úložiště s názvem jako AmazingAppMatch.
3. Nastavení Fastlane a nástroje match
Otevřete terminál, přejděte do složky s projektem a inicializujte fastlane, jak je uvedeno v
$ fastlane init
Budete vyzváni k výběru dostupných konfigurací použití. Vyberte čtvrtou možnost – ruční nastavení projektu.
Projekt má nový adresář fastlane, který obsahuje dva soubory – Appfile a Fastfile. Stručně řečeno, data služeb ukládáme do Appfile a zapisujeme úlohy do Fastfile, nazývané v terminologii Fastlane pruhy. Doporučuji přečíst si oficiální dokumentaci:
Otevřete Appfile ve svém oblíbeném textovém editoru a převeďte jej do následující podoby:
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
Vrátíme se k terminálu a podle oficiálního manuálu začneme konfigurovat match.
$ fastlane match init
$ fastlane match development
Dále zadejte požadované údaje - úložiště, účet, heslo atd.
Je důležité, aby se: Při prvním spuštění nástroje match budete požádáni o zadání hesla pro dešifrování úložiště. Toto heslo je velmi důležité uložit, budeme ho potřebovat při nastavování CI serveru!
Ve složce fastlane se objevil nový soubor - Matchfile. Otevřete jej ve svém oblíbeném textovém editoru a zobrazte jej takto:
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
Přesně tímto způsobem jej vyplníme, pokud chceme v budoucnu používat match k podepisování sestavení pro zobrazení v Crashlytics a/nebo AppStore, tedy k podepisování ID balíčku vaší aplikace.
Ale jak si pamatujeme, vytvořili jsme speciální Wildcard ID k podepsání testovacího sestavení. Proto otevřete Fastfile a zadejte nový jízdní pruh:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # создаем отдельный бранч для development сертификата для подписи тестовой сборки.
)
end
Uložte a zadejte do terminálu
fastlane testing_build_for_firebase
a vidíme, jak fastlane vytvořil nový certifikát a vložil ho do úložiště. Skvělý!
Otevřete XCode. Nyní máme potřebný zřizovací profil formuláře Match Development com.company.*, který musí být specifikován v sekci Provisioning profile pro cíle AmazingApp a AmazingAppUITests.
Zbývá přidat pruh pro montážní zkoušky. Pojďme
Pojďme zkopírovat a vložit z původního příkladu tak, aby naše lane testing_build_for_firebase nakonec vypadala takto:
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
Pro kompletní informace o nastavení fastlane v CircleCI doporučuji přečíst si oficiální dokumentaci
Nezapomeňte přidat nový úkol do našeho 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. A co naše testovací stolice? Nastavení Firebase.
Pojďme k tomu, k čemu byl článek napsán.
Možná vaše aplikace používá Firebase v bezplatném plánu, nebo možná vůbec. Neexistuje absolutně žádný zásadní rozdíl, protože pro potřeby testování můžeme vytvořit samostatný projekt s rokem bezplatného používání (cool, že?)
Přihlásíme se ke svému účtu infrastruktury (nebo k jakémukoli jinému, na tom nezáleží) a přejdeme na
Je důležité, aby se: V předchozím kroku ve Fastfile v pruhu firebase_test_lab_ios_xctest by měl parametr gcp_project odpovídat názvu projektu.
Výchozí nastavení nám docela vyhovuje.
Kartu nezavírejte, zaregistrujte se pod stejným účtem v
Google dává 300 dolarů na rok, což v kontextu provádění autotestů odpovídá jednomu roku bezplatného používání služby. Zadáme vaše platební údaje, počkáme na zkušební debet ve výši 1 USD a obdržíme 300 USD na váš účet. Po roce se projekt automaticky převede na bezplatný tarif, takže se nemusíte bát případné ztráty peněz.
Vraťme se na záložku s projektem Firebase a přenesme jej do tarifu Blaze – nyní máme z čeho platit při překročení limitu.
V rozhraní gcloud vyberte náš projekt Firebase, vyberte položku hlavní nabídky „Directory“ a přidejte rozhraní Cloud Testing API a Cloud Tools Result API.
Poté přejděte na položku nabídky „IAM a administrace“ -> Servisní účty -> Vytvořit servisní účet. Udělujeme práva na úpravu projektu.
Vytvořte klíč API ve formátu JSON
Stažený JSON budeme potřebovat o něco později, ale prozatím budeme považovat nastavení Test Lab za dokončené.
5. Nastavení CircleCI
Nabízí se rozumná otázka – co dělat s hesly? Mechanismus proměnné prostředí našeho sestavovacího stroje nám pomůže bezpečně ukládat naše hesla a další citlivá data. V nastavení projektu CircleCI vyberte Proměnné prostředí
A nastavte následující proměnné:
- klíč: GOOGLE_APPLICATION_CREDENTIALS
hodnota: obsah souboru json klíče účtu služby gcloud - klíč: MATCH_PASSWORD
hodnota: heslo pro dešifrování úložiště github pomocí certifikátů - klíč: FASTLANE_PASSWORD
hodnota: Heslo účtu infrastruktury Apple Developer Portal
Změny uložíme, vytvoříme PR a zašleme je vedoucímu našeho týmu ke kontrole.
Výsledky
V důsledku těchto jednoduchých manipulací jsme v době testování dostali dobrý, stabilní pracovní stojan se schopností nahrávat video na obrazovce zařízení. V testovacím příkladu jsem specifikoval model zařízení iPhone X, ale farma poskytuje bohatý výběr z kombinace různých modelů a verzí iOS.
Druhá část bude věnována krok za krokem nastavení Firebase Test Lab pro projekt Android.
Zdroj: www.habr.com