Как я могу заставить 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)
}
}
Я понимаю, что в качестве альтернативы я мог бы реализовать кнопку "четкие данные" в главном приложении, и приложение инструментария щелкнуло бы через пользовательский интерфейс, но я нахожу это решение нежелательным.
Я посмотрел API AndroidJUnitRunner
, и есть крючки через интерфейс 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
Я также все уши, если есть альтернативный способ. Разумеется, с автоматизацией тестирования устройств должен быть четкий способ очистки данных приложения?
Спасибо!