gradle Android Studio --为仪器测试清除应用程序数据

lstz6jyr  于 2023-08-06  发布在  Android
关注(0)|答案(3)|浏览(145)

如何让Android Studio(AndroidJunitRunner)在仪器测试之前清除应用程序数据,而无需手动运行adb命令?

我发现android.support.test.runner.AndroidJUnitRunner是一种欺骗--它从来没有真正调用过connectedCheckconnectedAndroidTest
1.从命令行运行时$ gradle connectedCheck

:MyMainApp:assembleDebug UP-TO-DATE
:MyMainApp:assembleDebugTest UP-TO-DATE
:MyMainApp:clearMainAppData
:MyMainApp:connectedCheck

字符串
1.在IDE中通过单击仪器测试配置(带红色/绿色箭头的绿色Android机器人徽标)运行时

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


可以看到,最后一个gradle目标是assembleDebugTest
我已经在build.gradle中的connectedCheck上添加了一个钩子,以便在开始仪器测试之前清除主应用程序的数据。

// 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
    我也洗耳恭听,如果有一个替代的方法。设备测试自动化肯定会有一个明确的方法来清除应用程序数据吗?

谢谢你,谢谢

aij0ehis

aij0ehis1#

我知道这已经有一段时间了,希望现在你能解决这个问题。
我今天遇到了同样的问题,没有任何解决方案就坠毁在这里。
但是我设法通过从测试配置调用我的任务使它工作。
步骤1:转到测试配置


的数据
第2步:添加您创建的gradle任务



顺便说一下,在我的例子中,任务看起来像这样:

task clearData(type: Exec) {
  def clearDataCommand = ['adb', 'shell', 'pm', 'clear', 'com.your.application']
  commandLine clearDataCommand
}

字符串
希望这对某人有帮助:)

dauxcl2d

dauxcl2d2#

在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

x6492ojm

x6492ojm3#

2023年解决方案

1.添加依赖项(在此处查看实际版本):

使用Gradle:

dependencies {
    androidTestImplementation 'androidx.test:runner:1.5.2'
    androidTestUtil 'androidx.test:orchestrator:1.4.2'
}

字符串

带版本目录:

[versions]
testRunner = "1.5.2"
orchestrator = "1.4.2"

[libraries]
orchestrator = { group = "androidx.test", name = "runner", version.ref = "testRunner" }
orchestrator = { group = "androidx.test", name = "orchestrator", version.ref = "orchestrator" }


1.修改gradle文件。将以下语句添加到项目的build.gradle文件中:

Kotlin:

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 += mapOf(
            "clearPackageData" to "true",
        )
}

testOptions {
    execution = "ANDROIDX_TEST_ORCHESTRATOR"
}

Groovy:

defaultConfig {
  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  testInstrumentationRunnerArguments clearPackageData: 'true'
}

testOptions {
  execution 'ANDROIDX_TEST_ORCHESTRATOR'
}


Android Developers文档

相关问题