我有多个测试包:
com.mypackage.blackbox - Robotium UI tests
com.mypackage.integration - REST integration tests
com.mypackage.unit - low level unit tests
我们的服务器团队需要能够在每次推送时运行集成测试(它们需要几分钟),然后每晚运行所有测试(黑盒UI测试需要10分钟以上)。
This great answer通过重载现有的JUnit注释(如@SmallTest
或@LargeTest
)来提供一种稍微有点(但有效)的方法。
The Gradle documentation建议测试过滤器是这样做的方法,例如
./gradlew connectedAndroidTestDevDebug --tests com.mypackage.integration.*
然而,这失败了> Unknown command-line option '--tests'.
错误(可能是因为Android Gradle插件不支持vanilla Gradle所做的一切?)。
同样的文件说他们将来计划支持这些替代方案:
- 根据自定义注释(未来)进行过滤
- 根据测试层次过滤;执行所有扩展ceratain基类(未来)的测试
- 根据某些自定义运行时规则进行过滤,例如系统属性的特定值或某种静态(未来)
有人知道现在让它运转起来的干净方法吗?现在,我计划在我的所有集成测试扩展的基类上使用@MediumTest
注释,但我希望能够指定特定的包。使用@MediumTest
或@LargeTest
会滥用这些注释,因为我的集成和黑盒测试都是大型测试according to the guidelines。
答案 0 :(得分:3)
现在可以添加Android的Testing Support Library,现在您可以使用AndroidJUnitRunner
并过滤您自己的自定义注释所运行的测试。
使用自定义注释过滤测试运行到测试(在此示例中为com.myapp.MyAnnotation):
adb shell am \
instrument -w -e annotation com.myapp.MyAnnotation \
com.myapp/android.support.test.runner.AndroidJUnitRunner
Complete AndroidJUnitRunner Documentation
您需要使用自定义注释对测试用例进行注释才能使其正常工作。示例测试用例:
import android.support.test.runner.AndroidJUnit4;
import com.myapp.MyAnnotation;
@RunWith(AndroidJUnit4.class)
public class CalculatorTest {
@MyAnnotation
@Test
public void testAddition() {
//Do testing here
}
}
这是你的" MyAnnotation"看起来像是:
package com.myapp;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* My custom Annotation to specify a type of tests to run.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyAnnotation {
}
答案 1 :(得分:2)
要使用gradle运行特定测试,您必须创建自定义检测测试运行器类并使用该类运行测试。即创建类
package com.my.package;
public class MyInstrumentationTestRunner extends InstrumentationTestRunner {
@Override
public void onCreate(Bundle instrumentationArguments) {
instrumentationArguments.putString("size", "medium"); // Run medium tests
// Add more ...
super.onCreate(instrumentationArguments);
}
}
然后在build.gradle
集testInstrumentationRunner
(android -> defaultConfig
下,即
// ...
android {
// ...
defaultConfig {
// ...
testInstrumentationRunner "com.my.package.MyInstrumentationTestRunner"
}
}
// ...
希望有所帮助!
注意。 build.gradle
来自:lib
,测试位于创建src/androidTest/java
的{{1}}下。
答案 2 :(得分:1)
Sam's answer是最通用的答案。但是,最简单的解决方案可能是使用InstrumentationTestRunner上的-e package
选项:
在java包中运行所有测试: adb shell am instrument -w -e 包com.android.foo.subpkg com.android.foo/android.test.InstrumentationTestRunner
您可以将此选项与使用Square Spoon库结合使用,因为它允许您指定单个类,或使用-e
将选项传递给测试运行器(例如package
选项):
--class-name Test class name to run (fully-qualified)
--method-name Test method name to run (must also use --class-name)
--e Arguments to pass to the Instrumentation Runner. This can be used
multiple times for multiple entries. Usage: --e <NAME>=<VALUE>.
The supported arguments varies depending on which test runner
you are using, e.g. see the API docs for AndroidJUnitRunner.
为了记录,Shazam的Fork具有更强大的正则表达式选项:
android.test.classes=REGEX - comma separated regexes that specify a pattern for the classes/packages to run