如何在不手动运行adb
命令的情况下让 Android Studio (AndroidJunitRunner) 在仪器测试之前清除应用程序数据?
我发现了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)
}
}
我意识到,或者我可以在主应用程序中实现一个“清除数据”按钮,并让检测应用程序点击 UI,但我发现该解决方案不可取。
我查看了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
如果有另一种方法,我也全神贯注。当然,设备测试自动化应该有一种清除应用程序数据的清晰方法吗?
谢谢!