我正在尝试在Kotlin中为我的Android应用程序进行UI测试.由于使用ActivityTestRule的新系统,我无法使其工作:它正确编译,并在运行时,我得到:
java.lang.Exception: The @Rule 'mActivityRule' must be public.
at org.junit.internal.runners.rules.RuleFieldValidator.addError(RuleFieldValidator.java:90)
at org.junit.internal.runners.rules.RuleFieldValidator.validatePublic(RuleFieldValidator.java:67)
at org.junit.internal.runners.rules.RuleFieldValidator.validateField(RuleFieldValidator.java:55)
at org.junit.internal.runners.rules.RuleFieldValidator.validate(RuleFieldValidator.java:50)
at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:170)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:344)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:74)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55)
at android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:38)
at android.support.test.runner.AndroidJUnit4.<init>(AndroidJUnit4.java:36)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.buildAndroidRunner(AndroidAnnotatedBuilder.java:57)
at android.support.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:45)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runner.Computer.getRunner(Computer.java:38)
at org.junit.runner.Computer$1.runnerForClass(Computer.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98)
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84)
at org.junit.runners.Suite.<init>(Suite.java:79)
at org.junit.runner.Computer.getSuite(Computer.java:26)
at android.support.test.internal.runner.TestRequestBuilder.classes(TestRequestBuilder.java:691)
at android.support.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:654)
at android.support.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:329)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:226)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
Run Code Online (Sandbox Code Playgroud)
以下是我宣称的mActivityRule:
RunWith(javaClass<AndroidJUnit4>())
LargeTest
public class RadisTest {
Rule
public val mActivityRule: ActivityTestRule<MainActivity> = …Run Code Online (Sandbox Code Playgroud) 这个问题建议使用@Test批注的timeout参数让JUnit在超时期限后强制停止测试.
但到目前为止,我们已经完成了5000次单元测试,我们希望建立一个策略,要求开发人员永远不要发布需要10秒以上才能完成的测试.该政策可能会说"瞄准<10秒",但我们希望确保在30秒后停止任何测试.(这些数字只是示例,我们的想法是为大多数用例定义"足够好"的东西,但这也确保事情不会"永远"运行)
现在我想知道是否有一种方法可以启用此类行为,而无需转入每个测试用例并添加该注释参数.
现有问题也没有帮助:我正在寻找一个更改来启用此功能,而不是每个测试类解决方案一个更改.一个中央的全球开关.每个文件或方法不是一个.
JUnit中是否有一种方法可以为套件中包含的所有测试定义全局超时/限制.
好吧,让我来解释一下.
我想将junit测试套件引入到将在每个构建上运行的遗留项目的构建系统中.该套件应包含快速运行的单元测试,但该项目在其测试源文件夹中具有混合的集成和单元测试集.
所以我的目标是为单元测试引入一个中央测试套件,它只包含那些能够在一定时限内运行的测试(每个测试单独进行).
我希望通过引入@Rule注释来强制执行该规则.
我试过这个:
@RunWith(Suite.class)
@SuiteClasses({...})
public class FastTestSuite{
@Rule Timeout timeout = new Timeout(1);
}
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有成功.我知道有一个事实,即测试的速度远低于1毫秒,但没有一个测试失败.
设置:
我继承的一个较旧的项目有很多遗留的仪器测试,我想对它们施加超时,因为它们中的很多都可以无限期地挂起,这使得很难获得测试报告。我正在将测试更新为 Junit4 样式,但目前它们都在扩展 ActivityInstrumentationTestCase2。
到目前为止尝试过:
在AndroidJUnitRunner的文档中,它说要设置这个标志:
设置将应用于每个测试的超时(以毫秒为单位):-e timeout_msec 5000 ...
...所有参数也可以通过元数据标签在 AndroidManifest 中指定
我已经尝试将 AndroidJUnitRunner 配置添加到应用程序清单和测试清单,但 timeout_msec 元数据项到目前为止没有任何影响。