junit5とandroidのテスト

32
JUnit5 Android @kikuchy

Upload: hiroshi-kikuchi

Post on 23-Jan-2018

2.653 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: JUnit5とAndroidのテスト

JUnit5とAndroidのテスト

@kikuchy

Page 2: JUnit5とAndroidのテスト

Who?

@kikuchy

菊池 紘

株式会社Diverse (ミクシィグループ)

今月からAndroidエンジニアに復帰しました

Page 3: JUnit5とAndroidのテスト

JUnit5でAndroidのテストをする

Page 4: JUnit5とAndroidのテスト
Page 5: JUnit5とAndroidのテスト

できませんでした

Page 6: JUnit5とAndroidのテスト

以上

Page 7: JUnit5とAndroidのテスト

以上

Page 8: JUnit5とAndroidのテスト

JUnit5の便利機能をなるべくAndroidがらみのテストで使う

@kikuchy

Page 9: JUnit5とAndroidのテスト
Page 10: JUnit5とAndroidのテスト

JUnit5とは言わずと知れたJavaのテストフレームワークの最新版

10年以上メジャーアップデートしていなかったらしい

機能がモジュール化されている

そのためにJUnit4から全部書き直したらしい

Java8以降をターゲットにしている

ラムダ式、Interfaceのデフォルト実装などを使う部分がある

JUnit4以上の使い勝手の良さ

Page 11: JUnit5とAndroidのテスト

AndroidアプリケーションモジュールにJUnit5を使おうとすると

Page 12: JUnit5とAndroidのテスト

JUnit5とAndroid Gradle Pluginの相性JUnit platform gralde pluginは  java  プラグインを要求する

ソース見たら真っ先に自動で apply してた

Android Gradle Pluginは  java  プラグインと共存できない java  プラグインが使用されていると前ページのエラー発生

どちらかがなんとかしてくれないと多分無理

きっとTest Support Libraryがどうにかしてくれる

コンソールランチャーとか持ち出せば現時点でもどうにかなる

かも?

Page 13: JUnit5とAndroidのテスト
Page 14: JUnit5とAndroidのテスト

JavaライブラリモジュールでJUnit5を使う

Page 15: JUnit5とAndroidのテスト

// プロジェクトルート or Javaライブラリモジュールのbuild.gradlebuildscript { repositories { mavenCentral() } dependencies { classpath 'org.junit.platform:junit -platform-gradle-plugin:1.0.0' }}

// Javaライブラリモジュールのbuild.gradleapply plugin: 'java-library'apply plugin: 'org.junit.platform.gradle.plugin'

Page 16: JUnit5とAndroidのテスト

//Javaライブラリモジュールのbuild.gradledependencies { // 最低限この2つがあればいい testCompile "org.junit.jupiter: junit-jupiter-api:5.0.0" testRuntime "org.junit.jupiter: junit-jupiter-engine:5.0.0"}

Page 17: JUnit5とAndroidのテスト

public class CalcTest { @Test void test() { Calc c = new Calc(); assertEquals(3, c.calc(1, 2)); }}

Page 18: JUnit5とAndroidのテスト
Page 19: JUnit5とAndroidのテスト

Gradle Console

:lib:junitPlatformTest

Test run finished after 89 ms[ 2 containers found ][ 0 containers skipped ][ 2 containers started ][ 0 containers aborted ][ 2 containers successful ][ 0 containers failed ][ 1 tests found ][ 0 tests skipped ][ 1 tests started ][ 0 tests aborted ][ 1 tests successful ][ 0 tests failed ]

BUILD SUCCESSFUL in 2s

Page 20: JUnit5とAndroidのテスト
Page 21: JUnit5とAndroidのテスト

JUnit5の何がいいのか

Page 22: JUnit5とAndroidのテスト

パラメタライズドテストを簡単に書ける

同じロジックに対して、テストデータだけを変更して複数のテスト

を行う手法

よくやるので簡単にできて欲しい

JUnit4でもできるけれど簡単になったテストランナーの追加とか必要だった

アノテーション付けるだけでよくなった

まだExperimentalなのでAPIが変わっても文句は言えない

Page 23: JUnit5とAndroidのテスト

//JUnit4@RunWith(Theories.class)public class HogeTest { @DataPoints public static int[] VALUE_SOURCE = { 1, 2, 3 }; @Theory public void testWithValueSource(int argument) { assertNotNull(argument); }}

// JUnit5@ParameterizedTest@ValueSource(ints = { 1, 2, 3 })void testWithValueSource(int argument) { assertNotNull(argument);}

Page 24: JUnit5とAndroidのテスト

テストケースに欲しい値を注入できる

Mockitoで作ったモックを引数から入れるサンプルが最高

他にもアノテーション見て色々できたりしそう

@ExtendWith(MockitoExtension.class)class MyMockitoTest {

@BeforeEach void init(@Mock Person person) { when(person.getName()).thenReturn("Dilbert"); }

@Test void simpleTestWithInjectedMock(@Mock Person person) { assertEquals("Dilbert", person.getName()); }

}

Page 25: JUnit5とAndroidのテスト

アノテーションの名称がわかりやすい

 @Before  /  @After  ‑>  @BeforeEach  /  @AfterEach 各テストケース実行前後に呼ばれるやつ

 @BeforeClass  /  @AfterClass  ‑>  @BeforeAll  /  @AfterAll 各テストクラス実行前後に呼ばれるやつ

地味に嬉しいやつ

Page 26: JUnit5とAndroidのテスト

テストケースに任意の名称を付けられる

 @DisplayName()  で全角文字でも記号でも指定可能

「メソッド名が全角文字」というのが宗派的に無理な人が居る職場でも

安心

@DisplayName("A special test case")class DisplayNameDemo {

@Test @DisplayName("Custom test name containing spaces") void testWithDisplayNameContainingSpaces() { }

@Test @DisplayName("╯°□°)╯") void testWithDisplayNameContainingSpecialCharacters() }}

Page 27: JUnit5とAndroidのテスト

Androidのテストに使用できるようになった暁にはぜひ使いたいですね

Page 28: JUnit5とAndroidのテスト

発表後の追記

 @ogapants  さんに、AndroidアプリケーションモジュールでもJUnit5を使えるようにするプラグインの存在を教えていただきました!

https://github.com/aurae/android‑junit5

※ Kotlinで書いたテストは検出してくれないみたい・・・?

Page 29: JUnit5とAndroidのテスト
Page 30: JUnit5とAndroidのテスト
Page 31: JUnit5とAndroidのテスト
Page 32: JUnit5とAndroidのテスト