OTUS Homework 7: Mobile (Selenide + Appium)
Автотесты мобильного приложения Wishlist через Selenide + Appium и инфраструктура эмулятора через Docker Compose.
Что реализовано
- 3 сценария из ТЗ: списки желаний, подарки, резервирование подарка другого пользователя.
- Архитектура: базовый тест + экранные объекты (screens).
- Конфигурируемые capabilities через system properties.
- Подготовка тестовых данных через БД перед каждым тестом.
- Скрипты для сбора Logcat.
Стек и версии
- Java 21, Maven.
- Selenide: 7.3.1
- Appium Java Client: 9.3.0 (UiAutomator2)
- Selenium: 4.25.0
- JUnit: 5.10.2
- PostgreSQL JDBC: 42.7.10
- apk-parser: 2.6.10
- SLF4J: 2.0.13
- Docker Compose (эмулятор Android + Appium)
Структура проекта
src/test/java/ru/otus/mobile/tests— тесты.src/test/java/ru/otus/mobile/screens— экранные объекты.src/test/java/ru/otus/mobile/config— конфигурация Appium/Android.src/test/java/ru/otus/mobile/driver— фабрика драйвера.src/test/java/ru/otus/mobile/db— reset SQL и JDBC-клиент.docker-compose.yml— эмулятор Android с Appium.scripts/— утилиты (Logcat).
Инфраструктура (Docker Compose)
Эмулятор и Appium поднимаются одной командой:
docker compose up -d
Порты:
- Appium:
http://localhost:4723 - noVNC:
http://localhost:6080
APK берется из файла ./wishlist-349317-5fd795.apk, копируется в ./apk/wishlist.apk и монтируется в контейнер по пути /apk/wishlist.apk.
После старта контейнеров APK автоматически устанавливается в эмулятор и приложение стартует.
Подготовка данных через БД
Для повторяемости тестов перед каждым тестом выполняется SQL‑сброс данных аккаунта.
Данные доступа к БД не хранятся в репозитории — нужно передать через env или -D.
Аккаунты можно создать заранее (регистрация через приложение) или доверить это автотестам.
Если логин/пароль не переданы через параметры запуска, тест сгенерирует логины, создаст пользователей через reset‑SQL в БД (если их нет), затем выполнит логин. Регистрация через приложение используется как fallback, если вход не удался.
Переменные/свойства:
DB_URLили-Ddb.urlDB_USERили-Ddb.userDB_PASSWORDили-Ddb.passwordDB_RESET_SQLили-Ddb.reset.sql— SQL c параметрами?(username, email, password_hash, username). Если не задано, используется встроенный reset‑SQL (удаляет wishlists/gifts и создает пользователя при отсутствии).
Пример (PowerShell, значения подставить свои):
$env:DB_URL = "jdbc:postgresql://<host>:5432/<db>"
$env:DB_USER = "<user>"
$env:DB_PASSWORD = "<password>"
$env:DB_RESET_SQL = "<one-statement reset sql with ? placeholders>"
Как запускать
Полный прогон (обязательная последовательность)
- Поднять инфраструктуру:
docker compose up -d
Убедиться, что Docker Desktop/Engine запущен. Если Appium недоступен, тесты падают быстро с понятной ошибкой.
- Задать доступ к БД (обязательно, иначе тесты упадут):
$env:DB_URL="jdbc:postgresql://sql.otus.kartushin.su:5432/wishlist"
$env:DB_USER="student"
$env:DB_PASSWORD="student"
- Запустить все тесты (логины/пароли можно не задавать):
mvn test
Если логины не заданы, они будут сгенерированы автоматически, пользователь будет создан через БД (если отсутствует) и выполнится вход. Регистрация через приложение используется только как fallback, если вход не удался.
Опционально: задать логины/пароли тестовых пользователей (если зарегистрированы вручную):
mvn "-Dlogin.username.wishlists=<user1>" "-Dlogin.password.wishlists=<pass1>" \
"-Dlogin.username.gifts=<user2>" "-Dlogin.password.gifts=<pass2>" \
"-Dlogin.username.reservation=<user3>" "-Dlogin.password.reservation=<pass3>" \
"-Dreservation.owner=<user4>" \
test
Один тест
mvn "-Dtest=ru.otus.mobile.tests.WishlistsTest" test
Запуск через Docker Compose
mvn -Dappium.url=http://localhost:4723 -Dapp.path=/apk/wishlist.apk -Dapp.package=ru.otus.wishlist -Dapp.activity=ru.otus.wishlist.MainActivity test
Полный пример запуска (Appium + БД)
mvn -Dappium.url=http://localhost:4723 -Dapp.path=/apk/wishlist.apk -Dapp.package=ru.otus.wishlist -Dapp.activity=ru.otus.wishlist.MainActivity -Ddb.url=jdbc:postgresql://<host>:5432/<db> -Ddb.user=<user> -Ddb.password=<password> test
Параметры запуска
-Dappium.url— URL Appium (default:http://localhost:4723)-Dapp.path— путь до APK (default:/apk/wishlist.apk)-Dapp.package— package приложения (если APK недоступен локально)-Dapp.activity— main activity (если APK недоступен локально)-Ddevice.name— имя устройства (default:Android Emulator)-Dplatform.version— версия Android (опционально)-Dudid— UDID (опционально)-DnoReset— не сбрасывать состояние (default:false)-DnewCommandTimeout— timeout Appium, сек (default:120)-Dlogin.username.<account>— логин для конкретного теста (напримерlogin.username.wishlists)-Dlogin.password— пароль (default:Admin123)-Dlogin.password.hash— bcrypt‑хэш пароля для reset‑SQL (default в коде)
Сбор Logcat
PowerShell:
.\scripts\collect-logcat.ps1
Bash:
./scripts/collect-logcat.sh
Логи сохраняются в файл logcat.txt в корне проекта.