Files
homework_7/README.md
T
2026-04-07 00:53:07 +03:00

138 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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://<host>:5432/<db>"
$env:DB_USER = "<user>"
$env:DB_PASSWORD = "<password>"
$env:DB_RESET_SQL = "<one-statement reset sql with ? placeholders>"
```
## Как запускать
### Полный прогон (обязательная последовательность)
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=<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
```
### Один тест
```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://<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:
```powershell
.\scripts\collect-logcat.ps1
```
Bash:
```bash
./scripts/collect-logcat.sh
```
Логи сохраняются в файл `logcat.txt` в корне проекта.