使用Gradle运行特定的仪器化单元测试

48

有没有一种方法可以使用Gradle运行特定的Android仪器化单元测试?我已经尝试过

gradle -Dtest.single=UnitTestName connectedInstrumentTest

但是它似乎运行了该包中的所有测试。

8个回答

28

test.single 的使用似乎已经被弃用。正确的新方法是:

./gradlew :<module>:test --tests <pattern>

其中<pattern>可以是以下格式之一:

  • com.example.MyTest,运行com.example.MyTest类中的所有测试方法
  • *MyTest,匹配所有类名以MyTest结尾的类中的每个测试方法
  • *.MyTest.myMethod,运行任意包中类名为MyTest且特定测试方法名为myMethod的测试方法

如果您有一个多项目构建,请确保在test任务之前提供模块路径;否则,在每个子项目中搜索测试模式时,您将收到误导性错误消息。

我在Gradle网站上没有找到这些信息的文档记录。


2
确定它是应用了Java插件的模块吗?确定它不是古老版本的Gradle吗? - Chris Jones
9
如果我运行./gradlew test --tests *MyTest,会出现“未知命令行选项'--tests'”的错误,但如果我运行./gradlew testStagingDebug --tests *Mytest,则可以正常工作。我的项目有多个版本,因此我通常运行testStagingDebug任务来执行测试,尽管test任务也存在且可用。 - kodi
3
除非您在模式中指定通配符或使用:<module>:testDebug(或其他变体),否则似乎会出现“未知命令行选项'--tests'”的错误提示。 - aaronvargas
3
与其使用--tests命令,我通过以下方式使得测试成功:./gradlew :app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.locuslabs.android.sdk.TestActivityTest,感谢https://dev59.com/Gqnka4cB1Zd3GeqPMFT5#49403467提供的帮助。 - Michael Osofsky
1
要明确的是,@ChrisJones的答案适用于本地单元测试。如果您想运行仪器化(单元)测试,则需要使用Michael Osofsky的答案。 - tir38
显示剩余3条评论

27

如果您正在使用 instrumentationTestRunner ,则此方法适用:

./gradlew test -Pandroid.testInstrumentationRunnerArguments.class=<pkg>.YourClassName

使用 gradle 2.10 和 android gradle 插件 2.0.0-beta2。

由于您知道要运行哪个测试,您可能也知道要使用哪个模块/版本。您可以通过指定精确的模块和 gradle 任务来帮助 gradle。因此,如果您的测试位于 app 模块中,并且您想测试 debug 版本:

./gradlew app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=<pkg>.YourClassName

你甚至可以通过使用 tests_regex 参数使它变得更加花哨:

./gradlew app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.tests_regex=PartialClassName*
./gradlew app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.tests_regex=partialMethodName*

2
这是唯一一个适用于 Android Gradle 插件 2.0 及更高版本的仪器测试的实际可行版本。语法非常丑陋,但是没办法... - Thomas Keller
4
这个命令可以用于在连接的手机上运行测试:./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class='<pkg>.YourClassName' - Stan Kurdziel
2
为了测试特定的包,可以使用-Pandroid.testInstrumentationRunnerArguments.package=my.package - Thomas R.
我总是忘记这个,不得不一遍又一遍地回来查找。因此,我编写了一个快速的shell脚本,可能对其他人有所帮助:https://gist.github.com/tir38/1266cbf745f0077b0bbb8e54bf255f8f - tir38
1
运行特定的单元测试: ./gradlew connectedDevAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.StringUtilTest#testSelectLanguageFragment运行来自2个特定类的测试(用逗号分隔): ./gradlew connectedDevAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.StringUtilTest,com.example.OtherTest - ThomasW

21

模式是 -D<testTaskName>.single=<TestClass>,所以在您的示例中应该是:

gradle -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest

注意:此答案已过时。您应该在最新版本的Gradle中使用--tests开关。(有关说明,请参见其他答案)

注意:此答案已过时。您应该在最新版本的Gradle中使用--tests开关。(有关说明,请参见其他答案)

1
谢谢你的回答,但是它并没有帮助到我。gradlew -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest 命令也会启动所有测试。 - Ivan Gromov
UnitTestName是一个类名还是测试方法名?它必须是一个类名。 - erdi
1
这是一个类名。我也尝试添加了包名,但也没有起作用。 - Ivan Gromov
我也遇到了这种情况。在我的情况下,是使用命令 ./gradlew -Dtest.single=SimpleTest test 运行测试。但是它运行了我所有的测试。我有大约11个测试,我只想运行 SimpleTest 类中的一个测试。 - Wooseong Kim
@IvanGromov 我解决了这个问题。有人在他的Github上解决了这个问题并制作了自己的插件。 - Wooseong Kim
显示剩余2条评论

7

参考链接更改,暂时应该是正确的 https://developer.android.com/studio/test/command-line - peter_budo

1
你不应该忘记在 test 属性声明后指定构建变体名称,例如: -Dtest<buildVariantName>=<yourTestName>
比如说你有一个名为 debug 的构建类型,在编译后会得到一个名为 debug 的变体。如果你想仅运行此构建变体的测试,则应声明以下命令: ./gradlew -DtestDebug=UnitTestName testDebug

1
你得看看这个。

https://github.com/JCAndKSolutions/android-unit-test

我在这个 GitHub 仓库中提出了一个问题,这个人解决了我的问题并上传到了 Maven,所以在我的 build.gradle 文件中我使用了这个插件。
他的仓库里有写说明,你可以很容易地按照它进行操作。
使用这个 android-unit-test 插件后,我可以像这样使用。
../gradlew -Dtest.single=SomeTest test 

或者

../gradlew -Dtest.single=SomeTest clean check

现在它正在运行,我只能运行我想要的特定测试。

0

Erdi的答案对我没用,但我所有的测试类都有一个单独的父级,所以我能够这样做:

public abstract class BaseEspressoTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> {
    //...
    @Override
    protected void runTest() throws Throwable {
        if(getClass().getSimpleName().equals("MyTestClassName")) {
            super.runTest();
        }
    }
    //...
}

这只执行MyTestClassName。我们可以进一步扩展它,仅执行特定的测试方法(或方法):

public abstract class BaseEspressoTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> {
    //...
    @Override
    protected void runTest() throws Throwable {
        if("MyTestClassName".equals(getClass().getSimpleName()) 
           && "testMethodName".equals(getName())) {
            super.runTest();
        }
    }
    //...
}

0

Gradle 命令对我不起作用。 我使用了下面提到的 adb 命令。 为此,您需要先构建您的 apk。

adb shell am instrument -w -r -e package -e debug false .debug.test/android.support.test.runner.AndroidJUnitRunner


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接