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

Android 使用Gradle运行特定的仪器单元测试,android,unit-testing,gradle,Android,Unit Testing,Gradle,有没有一种方法可以使用Gradle运行特定的Android instrumentation单元测试?我试过了 gradle -Dtest.single=UnitTestName connectedInstrumentTest 但是它似乎运行包中的所有测试。模式是-D.single=,因此在您的示例中应该是: gradle -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest 注:此答案已过时。您应该在最新版

有没有一种方法可以使用Gradle运行特定的Android instrumentation单元测试?我试过了

gradle -Dtest.single=UnitTestName connectedInstrumentTest
但是它似乎运行包中的所有测试。

模式是
-D.single=
,因此在您的示例中应该是:

gradle -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest
注:此答案已过时。您应该在最新版本的Gradle中使用
--tests
开关。(有关解释,请参见其他答案)


你得看看这个

我在这个github存储库中遇到了一个问题,这个家伙解决了我的问题并上传到maven,所以在我的build.gradle文件中我使用了这个插件

说明写在他的存储库中。你可以很容易地理解它

使用这个android单元测试插件后,我可以使用

../gradlew -Dtest.single=SomeTest test 


现在它工作了,我只能运行我想运行的特定测试,Erdi的答案对我不起作用,但我的所有测试类都有一个单亲家长,所以我可以这样做:

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

您不应该忘记在
test
属性声明之后指定生成变量名称,如

-Dtest=

例如,如果您有一个编译后提供变量的
debug
生成类型,那么如果您只想为此生成变量运行测试,则应声明如下命令:


/gradlew-DtestDebug=UnitTestName testDebug

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

./gradlew :<module>:test --tests <pattern>
/gradlew::test——测试
其中,
可能类似于:

  • com.example.MyTest
    运行com.example.MyTest中的所有测试方法
  • *MyTest
    匹配名称以MyTest结尾的每个类中的每个方法
  • *.MyTest.myMethod
    在任何包中运行MyTest类中的特定测试方法
如果您有一个多项目构建,请确保在
测试
任务之前给出模块路径;否则,当它在每个子项目中搜索您的测试模式时,您将得到一条误导性的错误消息


在Gradle网站上我可以找到的任何地方都没有记录这些信息。

如果您使用的是
instrumentationTestRunner,则此功能有效:

./gradlew test -Pandroid.testInstrumentationRunnerArguments.class=<pkg>.YourClassName
您可以使用
tests\u regex
参数来替代:

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

由于Android gradle插件1.1.0-rc1,可以通过执行以下命令,使用
--tests
标志运行单个测试类:

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

请参见

Gradle命令不适用于我。 我使用下面的命令。 为此,您需要首先构建apk


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

感谢您的回答,但没有帮助
gradlew-DconnectedInstrumentTest。single=UnitTestName connectedInstrumentTest
也启动所有测试。
UnitTestName
是类名还是测试方法名?它必须是一个类名,它是一个类名。我还尝试添加一个包名,但也没有成功。我也遇到过这种情况。在我的例子中,
/gradlew-Dtest.single=SimpleTest测试
。然而,它运行我所有的测试。我有大约11个测试,我只想在SimpleTest类中运行1个测试。@IvanGromov我解决了这个问题。有人解决了这个问题,并在他的github中创建了自己的插件。确定这是一个应用了java插件的模块吗?确定这不是Gradle的一个古老版本吗?如果我执行
/gradlew test--tests*MyTest
,我会得到
未知命令行选项--tests'
,但是如果执行
/gradlew testStagingDebug--tests*MyTest
,它工作得很好。(我的项目有多种风格,因此
testStagingDebug
是我通常运行以执行测试的任务,尽管
test
任务存在并工作。)除非在模式中指定通配符或使用::testDebug(或其他风格),否则您似乎会得到
Unknown命令行选项“-tests”
我没有使用
--tests
而是使用了以下内容
/gradlew:app:connectedDebugAndroidTest-Pandroid.testinstrumentationrunnearguments.class=com.locasplates.android.sdk.TestActivityTest
,因为@ChrisJones的答案是针对本地单元测试的。如果你想运行插入式(单元)测试,你需要使用Michael Osofsky Answer,这是唯一一个真正适用于Android Gradle插件2.0及更高版本插入式测试的版本。语法更复杂,但是,是的……这也适用于在连接的手机上运行测试:
/gradlew connectedAndroidTest-Pandroid.testInstrumentationRunnerArguments.class='.YourClassName'
对于测试特定的软件包,它是
-Pandroid.testinstrumentrunnerarguments.package=my.package
,我总是忘记了这一点,不得不不断地回到这里看看这个。因此,我编写了一个可能对其他人有帮助的快速shell脚本:运行一个特定的单元测试:
/gradlew connectedDevAndroidTest-Pandroid.testInstrumentationRunneArguments.class=com.example.StringUtilTest#testSelectLanguageFragment
从两个特定的类运行测试(用逗号分隔):
/gradlew connectedDevAndroidTest-Pandroid.testInstrumentationRunnerArguments.class=com.example.StringUtilTest,com.example.OtherTest
参考链接更改,目前应该是正确的
./gradlew app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=<pkg>.YourClassName
./gradlew app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.tests_regex=PartialClassName*
./gradlew app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.tests_regex=partialMethodName*
./gradlew app:testDebug --tests=com.example.MyTest