IgorGanapolsky
IgorGanapolsky

Reputation: 26824

Tell Espresso to run specific tests on an emulator

I have Android instrumentation tests with Espresso. Some of my tests must be run on an emulator - due to using LinkedIn's TestButler (https://github.com/linkedin/test-butler) library. This library toggles wifi/gsm for specific test runs, and that is why these tests must be run on an emulator.

My question is - can I annotate any specific tests to run on an emulator, while having the other tests run on a real device?

Thanks

Upvotes: 3

Views: 1977

Answers (2)

IgorGanapolsky
IgorGanapolsky

Reputation: 26824

The most straightforward solution I found is to use JUnit Assume API: http://junit.org/junit4/javadoc/4.12/org/junit/Assume.html

So, inside the test methods that can only be run on an emulator, I put this code:

Assume.assumeTrue("This test must be run in an emulator!", Build.PRODUCT.startsWith("sdk_google"));

This results in the said test being ignored when it isn't run on an emulator, and a handy error msg in the run window: enter image description here


As you can see, the other two tests passed fine (in the green), and the entire test suite was able to run.

Upvotes: 1

Diego Torres Milano
Diego Torres Milano

Reputation: 69188

Yes, you can use a @ConditionalIgnore annotation as described in http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/.

You will have something like

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");
  }
}

EDIT

For this specific case of detecting a device or emulator you can also use @RequiresDevice.

Upvotes: 4

Related Questions