有没有办法使用 Gradle 运行特定的 Android 仪器单元测试?我试过了
gradle -Dtest.single=UnitTestName connectedInstrumentTest
但它似乎运行了包中的所有测试。
有没有办法使用 Gradle 运行特定的 Android 仪器单元测试?我试过了
gradle -Dtest.single=UnitTestName connectedInstrumentTest
但它似乎运行了包中的所有测试。
使用test.single
似乎已被弃用。新的正确方法是
./gradlew :<module>:test --tests <pattern>
哪里<pattern>
可能是这样的:
com.example.MyTest
运行 com.example.MyTest 中的所有测试方法*MyTest
匹配名称以 MyTest 结尾的每个类中的每个方法*.MyTest.myMethod
在任何包的 MyTest 类中运行特定的测试方法如果你有一个多项目构建,请确保在test
任务之前给出模块路径;否则,当它在每个子项目中搜索您的测试模式时,您会收到一条误导性的错误消息。
Gradle 网站上我能找到的任何地方都没有记录这些内容。
如果您使用的是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*
在您的示例中,该模式-D<testTaskName>.single=<TestClass>
应该是:
gradle -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest
注意:此答案已过时。您应该
--tests
在最新版本的 Gradle 中使用该开关。(有关解释,请参阅其他答案)
从 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
你得看看这个。
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
现在它正在工作,我只能运行我想要的特定测试
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();
}
}
//...
}
您不应该忘记在test
属性声明之后指定构建变体名称,例如
-Dtest<buildVariantName>=<yourTestName>
.
就像如果您有一个debug
构建类型debug
在编译后为您提供变体,那么如果您只想为此构建变体运行测试,您应该声明如下命令:
./gradlew -DtestDebug=UnitTestName testDebug
Gradle 命令对我不起作用。我使用了下面提到的 adb 命令。为此,您需要先构建您的 apk。
adb shell am instrument -w -r -e package -e debug false .debug.test/android.support.test.runner.AndroidJUnitRunner