Skip to content
kravchukki edited this page Dec 24, 2020 · 1 revision

Вся система состоит из 3 частей:

Железки

  1. Мак у меня на столе - подключен как нода в дженкинсе (naboo). Для того, чтобы все работало, необходимо запустить на нем jenkins-agent (перейти в naboo и там будет написано как это сделать)

  2. К нему необходимо подключить usb-хаб для Android девайсов. iOS девайсы можно подключать напрямую через type-c выходы.

Инфраструктура

На маке должны быть установлены:

  • python 3 (сейчас стоит 3.7)
  • appium (сейчас стоит 1.18.3, обновлять нужно хотя бы пару раз в год, но осторожно. Обычно когда выходит новая iOS (подождать месяц-полтора, пока добавят поддержку и починят баги), и когда выходит новый android (также, подождать пока добавят поддержку и починят баги). Инструкции по установке тут
  • appium также требует nodejs и npm
  • android sdk
  • xcode (нужно обновлять раз в год после выхода новой ios)
  • библиотека libimobiledevice - по идее ее с собой тянет appium, но иногда что-то идет не так и ее нужно ставить вручную

Код

Состоит из нескольких проектов:

infrastructure

Это ситема отчетов, представляющая собой веб приложение (бэк - django, фронт - webix, бд - postgres)

Собрать и поднять: cd infrasrtucture/front npm install npm run build

cd infrasrtucture/backend pip3 install -r requirements.txt python3 manage.py runserver localhost:порт

Взять дамп базы можно взять в дженкинсе либо поднять на пустой: python3 manage.py makemigrations python3 manage.py migrate

Внимание, если база пустая, нужно добавить туда девайсы и заимпортить тесты

general-ui-autotests

Содержит сами тесты и некий фреймворк для работы с ними: обвязка для настройки аппиума, фикстуры, шаги, локаторы.

Тесты состоят из фикстур и шагов. Фикстуры - это такие функции, которые запускаются до и после теста в зависимости от скоупа (раз в тестовую сессию, перед каждый тестом, и тд). помечаются декоратором @pytest.fixture. В фикстуры обернуты всякие костыли для того чтобы работать с падением тестов, например если тест закончился (или упал) на экране букмарок, вне зависимости от результата, перед следующим тестом запустится фикстура, которая вернет нас на основной экран с картой. Тело тестов состоит из шагов, шаги лежат в mapsme-appium/steps.

Запуск тестов из командной строки

python3 -m venv ./autotest_env source ./autotest_env/bin/activate pip3 install -r requirements.txt python3 general-ui-autotests/mapsme_appium/setup.py bdist_wheel pip3 install general-ui-autotests/mapsme_appium/dist/mapsme_appium-0.1-py3-none-any.whl

pytest general-ui-autotests/mapsme --rootdir general-ui-autotests/mapsme --html=report.html --log-cli-level=INFO [здесь идут остальные параметры]

Ссписок параметров:

  1. обязательные

--device-id - указывается id девайса, на котором запускается тест. --apk-name - если запускается на конкретной apk/ipa, то указывать имя файла, например "mapsme.apk" или "mapsme.ipa", если на уже установленном приложении - "release" -k ключ для выборки тестов. это может быть название одного теста, или класса, или файла с тестами. Например "test_bookmark" запустит все тесты в файле test_bookmark.py а "routing" запустит все тесты, в названии которых есть слово routing. Подробности можно почитать в документации к pytest. -m метка. обязательна ТОЛЬКО если параметр -k не задан. тесты помечены всякими разными метками, например bookmark, routing, webview, build_check

  1. необязательные:

--report-host - урл системы отчетов --refresh-tests - по умолчанию false. при значении true вместо запуска тестов импортит инфу о них в систему отчетов --skip-webview - по умолчанию False, при включенном параметре тесты с использованием webview не запускаются (например тесты где проверяется что-то про каталог маршрутов). нужен потому что в 70% случаев оно не работает спасибо appium))0) --clean-device - удалять ли все установленные мэпсми с телефона. По умолчанию false. Не стоит включать, если тесты запускаются на предустановленном вручную приложении, это его удалит)) --clean-data - дропать ли данные перед запуском тестов (aka удаление папки MapsWithMe), работает очевидно только на андроиде --simulator, по умолчанию false. используется только при локальной отладке на симуляторах/эмуляторах

  1. необязательные, нужны для дженкинса:

--build-number - номер сборки, по умолчанию 0, в дженкинсе номер берется из сборки на которой идет запуск --session-info - опять же некоторая инфа про дженкинс, по умолчанию вот такая строка, в дженкинсе она собирается скриптом '{"name":"","build_number":"","url":"","started_by":""}'

Помимо ui есть еще monkey тесты на андроид - хаотично тыкают в приложении все подряд и собирают крэши. Для них есть доп параметр --monkey-time - время теста (в секундах, по умолчанию 3600)

hardware-autotests

По сути то-же самое, что general-ui, только содержит специфичные тесты и настройки для hardware тестов. Там же лежит скрипт для снятия показаний c um24c, написанный на node js

Доп параметры pytest: --is-power, default=False, при включенном параметре перед тестом запустится скрипт для um24c и начет передавать данные в то место, которое указано в --report-host --is-memory, default=False, можно использовать только на андроидах. Помимо красивого графика об энергопотреблении нарисует красивый график о потреблении памяти --is-standart, default=False, нужен для записывания "эталона" показаний --time, default=10, время теста в минутах

Принцип работы: тест представляет из себя ведение по маршруту Москва-Воронеж с подкладыванием координат для эмуляции движения. Время теста определяется параметром. На ios координаты подкладываются напрямую, с андроидом все сложнее, там запускается lockito, так что перед тестом убедиться, что на девайсе установлен локито и там есть сохраненный маршрут Москва-Воронеж

jenkins

Тут лежат пайплайны, написанные на groovy, позволяющие запускать тесты в дженкинсе. В общем и целом там есть все инфраструктурные джобы, например те, которые мониторят девайсы, и те которые запускают тесты. названия у них совпадают с джобами в дженкинсе

vars

Библиотечка с некоторыми скриптами для дженкинса, к сожалению она должна лежать в корне репозитория и называться именно так

Clone this wiki locally