Android Studio - 清除Instrumentation Test的应用程序数据

时间:2015-07-30 00:57:33

标签: android-studio gradle android-gradle android-instrumentation

如何在不手动运行adb命令的情况下让Android Studio(AndroidJunitRunner)清除检测测试之前的应用程序数据?

我发现了android.support.test.runner.AndroidJUnitRunner种作弊行为 - 它从未实际调用过connectedCheckconnectedAndroidTest

  1. 从命令行$ gradle connectedCheck

    运行时
    :MyMainApp:assembleDebug UP-TO-DATE
    :MyMainApp:assembleDebugTest UP-TO-DATE
    :MyMainApp:clearMainAppData
    :MyMainApp:connectedCheck
    
  2. 通过单击检测测试配置(带有红色/绿色箭头的绿色Android机器人徽标)在IDE中运行时

    **Executing tasks: [:MyMainAppApp:assembleDebug, :MyMainAppApp:assembleDebugTest]**
    

    如您所见,最后一个gradle目标是assembleDebugTest

  3. 我在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
    • 或者最好调用我的gradle任务adb shell pm clear my.main.app.package

    如果有其他方法,我也会全力以赴。当然,设备测试自动化应该有清晰的方法来清除应用程序数据吗?

    谢谢!

2 个答案:

答案 0 :(得分:24)

我知道它已经有一段时间了,希望到现在为止你会解决这个问题。

今天我遇到了同样的问题,并在没有任何解决方案的情况下崩溃了。

但我设法通过从测试配置中调用我的任务来使其工作。

第1步:转到测试配置

Your test configuration

第2步:只需添加您创建的gradle任务

Simply call your gradle task from here

顺便说一句,在我的情况下,任务看起来像这样:

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