Казвам се Дмитрий, работя като тестер в компанията
Преди това вече бях пробвал Firebase Test Lab за Android и много ми хареса всичко, така че реших да опитам да поставя тестовата инфраструктура на iOS на проекта на същата основа. Трябваше да търся много в Google и не всичко се получи от първия път, затова реших да напиша статия с уроци за тези, които все още се борят.
Така че, ако имате UI тестове на проект за iOS, вече можете да опитате да ги стартирате на реални устройства днес, любезно предоставени от Good Corporation. За тези, които се интересуват, добре дошли в кат.
В историята реших да надградя върху някои първоначални данни - частно хранилище в GitHub и системата за изграждане CircleCI. Името на приложението е AmazingApp, bundleID е com.company.amazingapp. Представям тези данни веднага, за да намаля последващото объркване.
Ако сте внедрили определени решения във вашия проект по различен начин, споделете опита си в коментарите.
1. Самите тестове
Създайте нов клон на проекта за UI тестове:
$ git checkout develop
$ git pull
$ git checkout -b “feature/add-ui-tests”
Нека отворим проекта в XCode и създадем нов Target с UI тестове [XCode -> File -> New -> Target -> iOS Testing Bundle], като му дадем разбиращото се име AmazingAppUITests.
Отидете в раздела Build Phases на създадената цел и проверете за наличието на Target Dependencies - AmazingApp, в Compile Sources - AmazingAppUITests.swift.
Добра практика е да отделите различни опции за изграждане в отделни схеми. Ние създаваме схема за нашите UI тестове [XCode -> Product -> Scheme -> New Scheme] и ѝ даваме същото име: AmazingAppUITests.
Изграждането на създадената схема трябва да включва целта на основното приложение - AmazingApp и тестове за целеви потребителски интерфейс - AmazingAppUITests - вижте екранната снимка
След това създаваме нова конфигурация на компилация за UI тестове. В XCode щракнете върху файла на проекта и отидете в секцията Информация. Кликнете върху „+“ и създайте нова конфигурация, например XCtest. Ще имаме нужда от това в бъдеще, за да избегнем танците с тамбура, когато става въпрос за подписване на кодове.
Във вашия проект има поне три Target: основното приложение, модулни тестове (в края на краищата те съществуват, нали?) и Target UI тестове, които създадохме.
Отидете на Target AmazingApp, раздел Настройки за компилация, раздел Самоличност за подписване на код. За конфигурацията на XCtest изберете iOS Developer. В секцията Стил на подписване на код изберете Ръчно. Все още не сме генерирали профил за осигуряване, но определено ще се върнем към него малко по-късно.
За Target AmazingAppUITests правим същото, но в колоната Product Bundle Identifier въвеждаме com.company.amazingappuitests.
2. Създаване на проект в програмата за разработчици на Apple
Отидете на страницата на програмата за разработчици на Apple, отидете на секцията Сертификати, идентификатори и профили и след това на колоната Идентификационни номера на приложения на елемента Идентификатори. Създайте нов идентификатор на приложение, наречен AmazingAppUITests и bundleID com.company.amazingappuitests.
Сега имаме възможност да подписваме нашите тестове с отделен сертификат, но... Процедурата за сглобяване на компилация за тестване включва асемблиране на самото приложение и асемблиране на тестовия инструмент. Съответно сме изправени пред проблема с подписването на два идентификатора на пакет с един профил за осигуряване. За щастие има просто и елегантно решение - Wildcard App ID. Повтаряме процедурата за създаване на нов App ID, но вместо Explicit App ID, изберете Wildcard App ID, както е на екранната снимка.
На този етап приключихме работата с developer.apple.com, но няма да минимизираме прозореца на браузъра. Хайде да отидем до
Внимателен читател забеляза, че за да използваме тази помощна програма, ще ни трябва частно хранилище и акаунт с достъп както до програмата за разработчици на Apple, така и до Github. Създаваме (ако изведнъж няма такова нещо) акаунт на формуляра [имейл защитен], измислете силна парола, регистрирайте я на developer.apple.com и я назначете като администратор на проекта. След това даваме на акаунта достъп до github хранилището на вашата компания и създаваме ново частно хранилище с име като AmazingAppMatch.
3. Настройване на Fastlane и помощната програма за съвпадение
Отворете терминал, отидете в папката с проекта и инициализирайте fastlane, както е посочено в
$ fastlane init
Ще бъдете подканени да изберете налични конфигурации за използване. Изберете четвъртата опция - ръчна настройка на проекта.
Проектът има нова директория fastlane, която съдържа два файла - Appfile и Fastfile. С две думи, ние съхраняваме данни за услугата в Appfile и записваме задачи в Fastfile, наречени ленти в терминологията на Fastlane. Препоръчвам да прочетете официалната документация:
Отворете Appfile в любимия си текстов редактор и го пренесете до следния формуляр:
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
Връщаме се към терминала и според официалното ръководство започваме да конфигурираме съвпадение.
$ fastlane match init
$ fastlane match development
След това въведете исканите данни - хранилище, акаунт, парола и др.
Важно: Когато за първи път стартирате помощната програма за съпоставяне, ще бъдете помолени да въведете парола за декриптиране на хранилището. Много е важно да запазите тази парола; ще ни е необходима, когато настройваме CI сървъра!
В папката на fastlane се появи нов файл - Matchfile. Отворете го в любимия си текстов редактор и го покажете така:
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
Ние го попълваме точно по този начин, ако искаме да използваме match в бъдеще, за да подписваме компилации за показване в Crashlytics и/или AppStore, тоест да подписваме ID на пакета на вашето приложение.
Но, както си спомняме, създадохме специален ID с заместващ символ, за да подпишем тестовата компилация. Затова отворете Fastfile и въведете нова лента:
lane :testing_build_for_firebase do
match(
type: "development",
readonly: true,
app_identifier: "com.company.*",
git_branch: "uitests" # создаем отдельный бранч для development сертификата для подписи тестовой сборки.
)
end
Запазете и влезте в терминала
fastlane testing_build_for_firebase
и виждаме как fastlane създаде нов сертификат и го постави в хранилището. Страхотен!
Отворете XCode. Сега имаме необходимия профил за предоставяне на формата Match Development com.company.*, който трябва да бъде посочен в раздела за профил за осигуряване за целите AmazingApp и AmazingAppUITests.
Остава да добавим лента за сглобяване на тестове. Хайде да отидем до
Нека копираме-поставим от оригиналния пример, така че нашата лента testing_build_for_firebase да изглежда така:
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
За пълна информация относно настройката на fastlane в CircleCI препоръчвам да прочетете официалната документация
Не забравяйте да добавите нова задача към нашия 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. Какво ще кажете за нашия тестов стенд? Настройване на Firebase.
Нека да разберем за какво е написана статията.
Може би вашето приложение използва Firebase на безплатен план или може би изобщо не използва. Няма абсолютно никаква фундаментална разлика, защото за нуждите на тестването можем да създадем отделен проект с година на безплатно използване (готино, нали?)
Влизаме в нашия инфраструктурен акаунт (или който и да е друг, няма значение) и отиваме на
Важно: В предишната стъпка в Fastfile в лентата firebase_test_lab_ios_xctest параметърът gcp_project трябва да съответства на името на проекта.
Настройките по подразбиране ни устройват доста добре.
Не затваряйте раздела, регистрирайте се под същия акаунт в
Google дава $300 за една година, което в контекста на извършване на автотестове е еквивалентно на една година безплатно използване на услугата. Ние въвеждаме вашата информация за плащане, изчакваме тестовия дебит от $1 и получаваме $300 по вашата сметка. След една година проектът автоматично ще бъде прехвърлен към безплатен тарифен план, така че няма нужда да се притеснявате за възможна загуба на пари.
Нека се върнем в раздела с проекта Firebase и го прехвърлим в тарифния план Blaze - сега имаме какво да платим, ако лимитът бъде надвишен.
В интерфейса на gcloud изберете нашия проект Firebase, изберете елемента от главното меню „Директория“ и добавете API за тестване на облака и API за резултати от облачни инструменти.
След това отидете на елемента от менюто „IAM и администрация“ -> Акаунти за услуги -> Създаване на акаунт за услуги. Предоставяме права за редакция на проекта.
Създайте API ключ във формат JSON
Изтегленият JSON ще ни трябва малко по-късно, но засега ще считаме настройката на Test Lab за завършена.
5. Настройка на CircleCI
Възниква разумен въпрос - какво да правя с паролите? Механизмът за променливи на средата на нашата компилираща машина ще ни помогне да съхраняваме сигурно нашите пароли и други чувствителни данни. В настройките на проекта CircleCI изберете Променливи на средата
И задайте следните променливи:
- ключ: GOOGLE_APPLICATION_CREDENTIALS
стойност: съдържанието на json файла на ключа на акаунта на услугата gcloud - ключ: MATCH_PASSWORD
стойност: парола за дешифриране на хранилището на github със сертификати - ключ: FASTLANE_PASSWORD
стойност: парола за акаунт в инфраструктурата на портала за разработчици на Apple
Ние запазваме промените, създаваме PR и го изпращаме на нашия ръководител на екипа за преглед.
Резултати от
В резултат на тези прости манипулации получихме добра, стабилна работеща стойка с възможност за запис на видео на екрана на устройството по време на тестването. В тестовия пример посочих модела на устройството iPhone X, но фермата предоставя богат избор от комбинация от различни модели и версии на iOS.
Втората част ще бъде посветена на стъпка по стъпка настройка на Firebase Test Lab за Android проект.
Източник: www.habr.com