We have a suite of Android instrumentation tests which we run from CL via ./gradlew app:connectedDebugAndroidTest If there is a failing test we basically have to wait for all of them to complete before the HTML report is generated. What we would like is for the testing to stop on the first failing test. Is there a gradle flag we can apply to make this happen? I haven't found anything in the official docs.
I don't know if you found a solution yet, but I was thinking about it and I came up with using a TestRunner or TestRule. I think the TestRunner approach is more appropriate though. I'm not the biggest fan of the companion objects / static fields used, but it works. I've tested it using a single emulator, but not with sharded tests across multiple emulators (but I think it won't propagate the any failure across all emulators).
A custom TestRunner that is aware of test failures and ignores tests after the first test fails. I've created a cut down version of AndroidJUnit4 with the functionality here: https://gist.github.com/AniFichadia/0a0aa665dfc554e963d2ab3276247efb#file-skiponfirstfailuretestrunner-kt
AndroidJUnit4 essentially delegates to either androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner or org.robolectric.RobolectricTestRunner.
The above implementation has a subclass of AndroidJUnit4ClassRunner and prevents test methods from running (by treating them as ignored) if any test fails. If you need Robolectric, then the implementation for a custom RobolectricTestRunner is the same as the custom AndroidJUnit4ClassRunner in the gist, and you can use a similar check as what's in AndroidJUnit4.loadRunner(Class).
To use it, you just have to annotate your test classes with the runner: @RunWith(SkipOnFirstFailureTestRunner::class).
Just have to watch out if AndroidJUnit4 changes internally (eg. with Nitrogen).
A test rule that will skip tests after the first test fails (by treating them as ignored): https://gist.github.com/AniFichadia/0a0aa665dfc554e963d2ab3276247efb#file-skiponfirstfailuretestrule-kt
You need to add the rule to your test classes and this can be applied to unit test classes too. It logs the first failed test, but I don't like this approach though.
TestRunner / TestRule
Perhaps you could use a BuildConfig field to enable it. This can be set to true in a non-productionised variant if the tests are running on CICD.
For the TestRunner you need to set the enabled property in the class itself.
For the TestRule, you can set if it's enabled using the enabled field in the constructor wherever it's being used.
Let me know what you think.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With