Как заставить Android Studio (AndroidJunitRunner) очищать данные приложения перед тестированием инструментария без ручного запуска команды adb
?
Я обнаружил этот android.support.test.runner.AndroidJUnitRunner
вид читов - он никогда не вызывает connectedCheck
или connectedAndroidTest
.
При запуске из командной строки
$ gradle connectedCheck
:MyMainApp:assembleDebug UP-TO-DATE :MyMainApp:assembleDebugTest UP-TO-DATE :MyMainApp:clearMainAppData :MyMainApp:connectedCheck
При запуске из среды IDE, щелкнув конфигурацию инструментального теста (зеленый логотип робота Android с красными / зелеными стрелками)
**Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
Как видите, последняя цель gradle -
assembleDebugTest
Я добавил ловушку для connectedCheck
в build.gradle
, чтобы очистить данные основного приложения перед запуском инструментального теста.
// Run 'adb' shell command to clear application data of main app for 'debug' variant
task clearMainAppData(type: Exec) {
// we have to iterate to find the 'debug' variant to obtain a variant reference
android.applicationVariants.all { variant ->
if (variant.name.equals("debug")) {
def clearDataCommand = ['adb', 'shell', 'pm', 'clear', getPackageName(variant)]
println "Clearing application data of ${variant.name} variant: [${clearDataCommand}]"
commandLine clearDataCommand
}
}
}
// Clear Application Data (once) before running instrumentation test
tasks.whenTaskAdded { task ->
// Both of these targets are equivalent today, although in future connectedCheck
// will also include connectedUiAutomatorTest (not implemented yet)
if(task.name.equals("connectedAndroidTest") || task.name.equals("connectedCheck" )){
task.dependsOn(clearMainAppData)
}
}
Я понимаю, что в качестве альтернативы я мог бы реализовать кнопку «Очистить данные» в главном приложении и заставить инструментальное приложение щелкать пользовательский интерфейс, но я считаю это решение нежелательным.
Я посмотрел на AndroidJUnitRunner
API, и там есть хуки через Runlistener
интерфейс, но хуки находятся в контексте тестового приложения, т.е. работают на устройстве, а Android запрещает одному приложению изменять другое приложение. http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html
Лучший ответ - к вам, если вы можете помочь мне автоматически запустить одно из следующих действий из Android Studio:
- выполнить командную строку
adb shell pm clear my.main.app.package
, - или, желательно, вызвать мою задачу gradle
clearMainAppData
Я тоже все уши, если есть альтернативный способ. Разве с автоматизацией тестирования устройств должен быть четкий способ очистки данных приложения?
Спасибо!