我使用Espresso进行Android测试。我的一些测试必须在模拟器上运行 - 因为使用了LinkedIn的TestButler(https://github.com/linkedin/test-butler)库。这个库为特定的测试运行切换wifi / gsm,这就是为什么这些测试必须在模拟器上运行。
我的问题是 - 我可以在模拟器上注释任何特定的测试,同时让其他测试在真实设备上运行吗?
由于
答案 0 :(得分:2)
是的,您可以使用http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/中描述的@ConditionalIgnore
注释。
您将拥有类似
的内容public class SomeTest {
@Rule
public ConditionalIgnoreRule rule = new ConditionalIgnoreRule();
@Test
@ConditionalIgnore( condition = NotRunningOnEmulator.class )
public void testSomething() {
// ...
}
}
public class NotRunningOnEmulator implements IgnoreCondition {
public boolean isSatisfied() {
return !Build.PRODUCT.startsWith("sdk_google");
}
}
对于检测设备或模拟器的特定情况,您还可以使用@RequiresDevice
。
答案 1 :(得分:1)
我发现最直接的解决方案是使用JUnit Assume API:http://junit.org/junit4/javadoc/4.12/org/junit/Assume.html
所以,在只能在模拟器上运行的测试方法中,我把这段代码写成:
Assume.assumeTrue("This test must be run in an emulator!", Build.PRODUCT.startsWith("sdk_google"));
这会导致在模拟器上运行时忽略所述测试,并在运行窗口中显示一个方便的错误消息:
正如您所看到的,其他两个测试通过正常(绿色),整个测试套件都可以运行。