有没有一种方法可以使用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且特定测试方法名为myMethod的测试方法如果您有一个多项目构建,请确保在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*
./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class='<pkg>.YourClassName'
- Stan Kurdziel-Pandroid.testInstrumentationRunnerArguments.package=my.package
。 - Thomas R../gradlew connectedDevAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.StringUtilTest#testSelectLanguageFragment
运行来自2个特定类的测试(用逗号分隔):
./gradlew connectedDevAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.StringUtilTest,com.example.OtherTest
- ThomasW模式是 -D<testTaskName>.single=<TestClass>
,所以在您的示例中应该是:
gradle -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest
注意:此答案已过时。您应该在最新版本的Gradle中使用--tests开关。(有关说明,请参见其他答案)注意:此答案已过时。您应该在最新版本的Gradle中使用
--tests
开关。(有关说明,请参见其他答案)
gradlew -DconnectedInstrumentTest.single=UnitTestName connectedInstrumentTest
命令也会启动所有测试。 - Ivan GromovUnitTestName
是一个类名还是测试方法名?它必须是一个类名。 - erdi./gradlew -Dtest.single=SimpleTest test
运行测试。但是它运行了我所有的测试。我有大约11个测试,我只想运行 SimpleTest 类中的一个测试。 - Wooseong Kim--tests
标志运行单个测试类,如下所示:./gradlew app:testDebug --tests=com.example.MyTest
test
属性声明后指定构建变体名称,例如:
-Dtest<buildVariantName>=<yourTestName>
。debug
的构建类型,在编译后会得到一个名为 debug
的变体。如果你想仅运行此构建变体的测试,则应声明以下命令:
./gradlew -DtestDebug=UnitTestName testDebug
。
https://github.com/JCAndKSolutions/android-unit-test
我在这个 GitHub 仓库中提出了一个问题,这个人解决了我的问题并上传到了 Maven,所以在我的 build.gradle 文件中我使用了这个插件。../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();
}
}
//...
}
Gradle 命令对我不起作用。 我使用了下面提到的 adb 命令。 为此,您需要先构建您的 apk。
adb shell am instrument -w -r -e package -e debug false .debug.test/android.support.test.runner.AndroidJUnitRunner
./gradlew test --tests *MyTest
,会出现“未知命令行选项'--tests'”的错误,但如果我运行./gradlew testStagingDebug --tests *Mytest
,则可以正常工作。我的项目有多个版本,因此我通常运行testStagingDebug
任务来执行测试,尽管test
任务也存在且可用。 - kodi--tests
命令,我通过以下方式使得测试成功:./gradlew :app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.locuslabs.android.sdk.TestActivityTest
,感谢https://dev59.com/Gqnka4cB1Zd3GeqPMFT5#49403467提供的帮助。 - Michael Osofsky