如何在不手动运行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中运行时
**Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
如您所见,最后一个gradle目标是assembleDebugTest
我在connectedCheck
的{{1}}添加了一个挂钩,以便在开始检测测试之前清除主应用的数据。
build.gradle
我意识到,或者我可以在主应用程序中实现“清除数据”按钮,并让检测应用程序点击UI,但我发现该解决方案不合适。
我查看了// 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
界面有钩子,但是钩子是在测试应用程序的上下文中,即在设备上运行,而Android禁止一个应用程序修改另一个应用程序。
http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html
最佳答案如果您可以帮助我在Android Studio中自动触发以下某项操作,则会找到您:
Runlistener
,adb shell pm clear my.main.app.package
如果有其他方法,我也会全力以赴。当然,设备测试自动化应该有清晰的方法来清除应用程序数据吗?
谢谢!
答案 0 :(得分:24)
我知道它已经有一段时间了,希望到现在为止你会解决这个问题。
今天我遇到了同样的问题,并在没有任何解决方案的情况下崩溃了。
但我设法通过从测试配置中调用我的任务来使其工作。
第1步:转到测试配置
第2步:只需添加您创建的gradle任务
顺便说一句,在我的情况下,任务看起来像这样:
task clearData(type: Exec) {
def clearDataCommand = ['adb', 'shell', 'pm', 'clear', 'com.your.application']
commandLine clearDataCommand
}
希望这会有所帮助:)
答案 1 :(得分:3)
使用Android Test Orchestrator可以更轻松地通过gradle脚本提供此选项。
android {
defaultConfig {
...
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
以下是Android Test Orchestrator的链接
https://developer.android.com/training/testing/junit-runner#using-android-test-orchestrator