46

有没有办法使用 Gradle 运行特定的 Android 仪器单元测试?我试过了

gradle -Dtest.single=UnitTestName connectedInstrumentTest

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

4

8 回答 8

26

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

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

哪里<pattern>可能是这样的:

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

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

Gradle 网站上我能找到的任何地方都没有记录这些内容。

于 2015-09-09T16:52:34.093 回答
24

如果您使用的是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*
于 2016-02-23T18:51:50.400 回答
21

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

gradle -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest

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

于 2013-10-24T12:32:15.917 回答
7

从 Android gradle 插件 1.1.0-rc1 开始,可以--tests通过执行以下命令使用 flag 运行单个测试类:

./gradlew app:testDebug --tests=com.example.MyTest

请参阅http://tools.android.com/tech-docs/unit-testing-support#TOC-Running-from-Gradle

于 2016-03-15T08:52:01.633 回答
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

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

于 2013-11-19T19:59:00.190 回答
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();
        }
    }
    //...
}
于 2015-06-04T19:47:13.370 回答
0

您不应该忘记在test属性声明之后指定构建变体名称,例如

-Dtest<buildVariantName>=<yourTestName>.

就像如果您有一个debug构建类型debug在编译后为您提供变体,那么如果您只想为此构建变体运行测试,您应该声明如下命令:

./gradlew -DtestDebug=UnitTestName testDebug

于 2015-07-14T15:20:03.033 回答
0

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

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

于 2018-07-26T09:15:42.843 回答