diff --git a/.gitignore b/.gitignore index cb2d5cd..de0d3d4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,3 @@ build/ .DS_Store allure-results/ logcat.txt -apk/ -jobs/ -scripts/ -wiremock/__files/ diff --git a/README.md b/README.md index 85abd9c..96d48b8 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,8 @@ ## Инфраструктура `docker-compose.yml` поднимает: - `wiremock` для раздачи `wishlist.apk`; -- `android-emulator` с Appium и VNC. +- `android-emulator-1` (Android 13, Appium `:4723`, VNC `:6080`); +- `android-emulator-2` (Android 12, Appium `:4725`, VNC `:6081`). Приложение не маунтится в эмулятор и не ставится через ADB. APK скачивается Appium по capability `app`. @@ -50,7 +51,7 @@ $env:DB_PASSWORD="student" docker compose up -d ``` -2. Дождаться статуса `healthy` у `wiremock` и `android-emulator`: +2. Дождаться статуса `healthy` у `wiremock`, `android-emulator-1`, `android-emulator-2`: ```bash docker compose ps @@ -64,5 +65,13 @@ docker compose ps mvn test ``` +По умолчанию тесты запускаются параллельно на уровне классов (2 потока), а сессии распределяются по эмуляторам через `BlockingQueue`. + +Опционально можно явно задать пул эмуляторов: + +```powershell +$env:MOBILE_EMULATORS="android-emulator-1|http://localhost:4723|Android Emulator,android-emulator-2|http://localhost:4725|Android Emulator" +``` + ## Логи После выполнения тестов logcat сохраняется в файл `logcat.txt` в корне проекта через Selenium/Appium logs API. diff --git a/apk/.gitkeep b/apk/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/apk/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docker-compose.yml b/docker-compose.yml index f0e14df..0755de4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: timeout: 5s retries: 12 - android-emulator: + android-emulator-1: image: budtmo/docker-android:emulator_13.0 depends_on: - wiremock @@ -33,3 +33,27 @@ services: timeout: 5s retries: 40 start_period: 30s + + android-emulator-2: + image: budtmo/docker-android:emulator_12.0 + depends_on: + - wiremock + devices: + - /dev/kvm:/dev/kvm + ports: + - "4725:4723" + - "6081:6080" + environment: + - DEVICE=Pixel_4 + - APPIUM=true + - WEB_VNC=true + - ENABLE_VNC=true + - AUTO_GRANT_PERMISSIONS=true + - EMULATOR_PARAMS=-no-window -no-audio -gpu swiftshader_indirect -no-snapshot -no-boot-anim + shm_size: 2gb + healthcheck: + test: ["CMD-SHELL", "[ \"$(cat /home/androidusr/device_status 2>/dev/null)\" = \"READY\" ]"] + interval: 15s + timeout: 5s + retries: 40 + start_period: 30s diff --git a/pom.xml b/pom.xml index ffd4b27..7732354 100644 --- a/pom.xml +++ b/pom.xml @@ -108,6 +108,13 @@ ${surefire.version} false + + true + same_thread + concurrent + fixed + 2 + diff --git a/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java b/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java index 72928ea..bdb5fa4 100644 --- a/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java +++ b/src/main/java/ru/otus/mobile/driver/MobileDriverFactory.java @@ -8,12 +8,6 @@ import java.net.MalformedURLException; import java.net.URI; public final class MobileDriverFactory { - private final MobileConfig config; - - public MobileDriverFactory(MobileConfig config) { - this.config = config; - } - public AndroidDriver create(MobileConfig.Emulator emulator) { UiAutomator2Options options = new UiAutomator2Options() .setPlatformName("Android") diff --git a/src/main/java/ru/otus/mobile/guice/CoreModule.java b/src/main/java/ru/otus/mobile/guice/CoreModule.java index 6fcd1ba..15daf6d 100644 --- a/src/main/java/ru/otus/mobile/guice/CoreModule.java +++ b/src/main/java/ru/otus/mobile/guice/CoreModule.java @@ -26,7 +26,8 @@ public final class CoreModule extends AbstractModule { String rawEmulators = value( "mobile.emulators", "MOBILE_EMULATORS", - "emulator-1|http://localhost:4723|Android Emulator" + "android-emulator-1|http://localhost:4723|Android Emulator," + + "android-emulator-2|http://localhost:4725|Android Emulator" ); List emulators = MobileConfig.Emulator.parse(rawEmulators, appUrl); return new MobileConfig(appPackage, appUrl, reservationOwner, emulators); @@ -55,8 +56,8 @@ public final class CoreModule extends AbstractModule { @Provides @Singleton - MobileDriverFactory mobileDriverFactory(MobileConfig config) { - return new MobileDriverFactory(config); + MobileDriverFactory mobileDriverFactory() { + return new MobileDriverFactory(); } @Provides