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