Android Studio - 清除仪器测试的应用程序数据 [英] Android Studio -- clear application data for Instrumentation Test
问题描述
如何在不手动运行 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
-
当通过点击仪器测试配置(带有红色/绿色箭头的绿色Android机器人徽标)从IDE内运行时
< pre $**执行任务:[:MyMainAppApp:assembleDebug,:MyMainAppApp:assembleDebugTest] **
正如你所看到的那样,最后一个Gradle目标
assembleDebugTest
我在 connectedCheck
在 build.gradle
中清除主应用程序的数据,然后开始检测测试。
//运行'adb'shell命令清除'debug'变体的主应用程序的应用程序数据
task clearMainAppData(type:Exec){
//我们必须遍历才能找到'debug'变体来获取变体引用
android.applicationVariants.all {variant - >
if(variant.name.equals(debug)){
def clearDataCommand = ['adb','shell','pm','clear',getPackageName(variant)]
println清除$ {variant.name}变体的应用程序数据:[$ {clearDataCommand}]
commandLine clearDataCommand
}
}
}
// //清除应用程序数据(一次)在运行检测前测试
tasks.whenTaskAdded {task - >
//这两个目标在今天是等效的,虽然未来connectedCheck
//也将包含connectedUiAutomatorTest(尚未实现)
if(task.name.equals(connectedAndroidTest)| | task.name.equals(connectedCheck)){
task.dependsOn(clearMainAppData)
}
}
我意识到,或者我可以在主应用程序中实现清除数据按钮,并让仪表应用程序单击UI,但我发现该解决方案不可取。
我查看了 AndroidJUnitRunner
API,并且通过 Runlistener
接口存在钩子,但是钩子在测试应用程序的上下文中,即在设备上运行,并且Android禁止一个应用程序修改另一个应用程序。
第2步:简单地添加您创建的gradle任务
顺便说一句,在我的例子中,任务看起来像这样:
任务clearData(类型:Exec){
def clearDataCommand = ['adb','shell','pm','clear','com.your.application']
commandLine clearDataCommand
}
希望这能帮助某人:)
How can I get Android Studio (AndroidJunitRunner) to clear application data preceding an instrumentation test without manually running adb
command?
I discovered that android.support.test.runner.AndroidJUnitRunner
kind of cheats -- it never actually invokes connectedCheck
or connectedAndroidTest
.
When run from command line
$ gradle connectedCheck
:MyMainApp:assembleDebug UP-TO-DATE :MyMainApp:assembleDebugTest UP-TO-DATE :MyMainApp:clearMainAppData :MyMainApp:connectedCheck
When run from within IDE by clicking the instrumentation test configuration (green Android robot logo with red/green arrows)
**Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
As you can see, the last gradle target is
assembleDebugTest
I had added a hook onto connectedCheck
in build.gradle
to clear the data of the main app before starting the instrumentation test.
// 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)
}
}
I realize that alternatively I could implement a 'clear data' button in the main app and have the instrumentation app click through the UI, but I find that solution undesirable.
I looked at AndroidJUnitRunner
API and there are hooks via Runlistener
interface but hooks are during the context of the test app, i.e. running on device, and Android forbids one app from modifying another app.
http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html
Best answer goes to you if you can help me trigger one of the following automatically from within Android Studio:
- execute a command line
adb shell pm clear my.main.app.package
, - or preferably invoke my gradle task
clearMainAppData
I'm also all ears if there is an alternate way. Surely with device testing automation there should be a clear way to clear application data?
Thank you!
I know it's been a while, and hopefully by now you will have this issue sorted.
I ran into that same issue today, and crashed here without any solution.
But I managed to make it work by calling my task from the test configuration.
Step 1 : Go to your test configuration
Step 2 : Simply add the gradle task you created
By the way, the task in my case simply looks like this :
task clearData(type: Exec) {
def clearDataCommand = ['adb', 'shell', 'pm', 'clear', 'com.your.application']
commandLine clearDataCommand
}
Hope this will help someone :)
这篇关于Android Studio - 清除仪器测试的应用程序数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!