Slide 1

Slide 1 text

SHARING (TESTS) IS CARING

Slide 2

Slide 2 text

THE ISSUE Device tests are slow. Like real slow.

Slide 3

Slide 3 text

A HACKY SOLUTION Running Android tests on JVM

Slide 4

Slide 4 text

SHARED FOLDER Same level as androidTest and test. Same structure as well.

Slide 5

Slide 5 text

android { ... sourceSets { String sharedTestDir = 'src/sharedTest/java' test { java.srcDir sharedTestDir } androidTest { java.srcDir sharedTestDir } } } What happens in build.gradle stays in build.gradle

Slide 6

Slide 6 text

testImplementation 'androidx.test:runner:1.1.1' testImplementation 'androidx.test.espresso:espresso-core:3.1.1' testImplementation 'androidx.test.ext:junit:1.1.0' testImplementation 'org.robolectric:robolectric:4.1' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' androidTestImplementation 'androidx.test.ext:junit:1.1.0' We ❤ dependencies

Slide 7

Slide 7 text

testImplementation 'androidx.test:runner:1.1.1' testImplementation 'androidx.test.espresso:espresso-core:3.1.1' testImplementation 'androidx.test.ext:junit:1.1.0' testImplementation 'org.robolectric:robolectric:4.1' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' androidTestImplementation 'androidx.test.ext:junit:1.1.0' We ❤ dependencies

Slide 8

Slide 8 text

Everything always works as planned — Nobody ever

Slide 9

Slide 9 text

testOptions { unitTests { includeAndroidResources = true returnDefaultValues = true } } JVM needs to know, after all.

Slide 10

Slide 10 text

@RunWith(AndroidJUnit4::class) class MainActivityTest { @Test fun simple_test() { ActivityScenario.launch(MainActivity::class.java) onView(withId(R.id.fab)).check(matches(isDisplayed())) } }

Slide 11

Slide 11 text

@RunWith(AndroidJUnit4::class) class MainActivityTest { @Test fun simple_test() { ActivityScenario.launch(MainActivity::class.java) onView(withId(R.id.fab)).check(matches(isDisplayed())) } } It wouldn't really work without that

Slide 12

Slide 12 text

RUNNING TESTS

Slide 13

Slide 13 text

DEVICE TESTS

Slide 14

Slide 14 text

JVM TESTS

Slide 15

Slide 15 text

Test configuration should have different names — Me. So it's true.

Slide 16

Slide 16 text

FUN FACT

Slide 17

Slide 17 text

Default is Device tests! — Me again.

Slide 18

Slide 18 text

WAIT A MINUTE !

Slide 19

Slide 19 text

IF BOTH CONFIGURATIONS CAN SEE SHARED TESTS...

Slide 20

Slide 20 text

... DOES IT MEAN JENKINS WOULD RUN THEM TWICE?

Slide 21

Slide 21 text

YES!

Slide 22

Slide 22 text

BUT THAT IS A PROBLEM

Slide 23

Slide 23 text

YES!

Slide 24

Slide 24 text

BUT WE CAN FIX IT! !

Slide 25

Slide 25 text

! EXCLUDE SOME TESTS!

Slide 26

Slide 26 text

interface DoNotRunOnJvm Inside sharedTest folder

Slide 27

Slide 27 text

testOptions { ... unitTests.all { useJUnit { excludeCategories 'net.orgiu.tests.DoNotRunOnJvm' } } } Once more in build.gradle

Slide 28

Slide 28 text

testOptions { ... unitTests.all { useJUnit { excludeCategories 'net.orgiu.tests.DoNotRunOnJvm' } } } Once more in build.gradle

Slide 29

Slide 29 text

... AND FINALLY @RunWith(AndroidJUnit4::class) @Category(DoNotRunOnJvm::class) class MainActivityTest { @Test fun simple_test() { ActivityScenario.launch(MainActivity::class.java) onView(withId(R.id.fab)).check(matches(isDisplayed())) } }

Slide 30

Slide 30 text

... AND FINALLY @RunWith(AndroidJUnit4::class) @Category(DoNotRunOnJvm::class) class MainActivityTest { @Test fun simple_test() { ActivityScenario.launch(MainActivity::class.java) onView(withId(R.id.fab)).check(matches(isDisplayed())) } }

Slide 31

Slide 31 text

REMEMBER TO TEST

Slide 32

Slide 32 text

YOU'RE BEING WATCHED.

Slide 33

Slide 33 text

! THANKS FOR WATCHING!