# 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 поднимаются одной командой: ```bash 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.url` - `DB_USER` или `-Ddb.user` - `DB_PASSWORD` или `-Ddb.password` - `DB_RESET_SQL` или `-Ddb.reset.sql` — SQL c параметрами `?` (username, email, password_hash, username). Если не задано, используется встроенный reset‑SQL (удаляет wishlists/gifts и создает пользователя при отсутствии). Пример (PowerShell, значения подставить свои): ```powershell $env:DB_URL = "jdbc:postgresql://:5432/" $env:DB_USER = "" $env:DB_PASSWORD = "" $env:DB_RESET_SQL = "" ``` ## Как запускать ### Полный прогон (обязательная последовательность) 1) Поднять инфраструктуру: ```bash docker compose up -d ``` Убедиться, что Docker Desktop/Engine запущен. Если Appium недоступен, тесты падают быстро с понятной ошибкой. 2) Задать доступ к БД (обязательно, иначе тесты упадут): ```powershell $env:DB_URL="jdbc:postgresql://sql.otus.kartushin.su:5432/wishlist" $env:DB_USER="student" $env:DB_PASSWORD="student" ``` 3) Запустить все тесты (логины/пароли можно не задавать): ```bash mvn test ``` Если логины не заданы, они будут сгенерированы автоматически, пользователь будет создан через БД (если отсутствует) и выполнится вход. Регистрация через приложение используется только как fallback, если вход не удался. Опционально: задать логины/пароли тестовых пользователей (если зарегистрированы вручную): ```bash mvn "-Dlogin.username.wishlists=" "-Dlogin.password.wishlists=" \ "-Dlogin.username.gifts=" "-Dlogin.password.gifts=" \ "-Dlogin.username.reservation=" "-Dlogin.password.reservation=" \ "-Dreservation.owner=" \ test ``` ### Один тест ```bash mvn "-Dtest=ru.otus.mobile.tests.WishlistsTest" test ``` ### Запуск через Docker Compose ```bash mvn -Dappium.url=http://localhost:4723 -Dapp.path=/apk/wishlist.apk -Dapp.package=ru.otus.wishlist -Dapp.activity=ru.otus.wishlist.MainActivity test ``` ### Полный пример запуска (Appium + БД) ```bash 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://:5432/ -Ddb.user= -Ddb.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.` — логин для конкретного теста (например `login.username.wishlists`) - `-Dlogin.password` — пароль (default: `Admin123`) - `-Dlogin.password.hash` — bcrypt‑хэш пароля для reset‑SQL (default в коде) ## Сбор Logcat PowerShell: ```powershell .\scripts\collect-logcat.ps1 ``` Bash: ```bash ./scripts/collect-logcat.sh ``` Логи сохраняются в файл `logcat.txt` в корне проекта.