O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

JUnit5とAndroidのテスト

3.562 visualizações

Publicada em

Android Test Night #1 https://testnight.connpass.com/event/63753/
で発表した(する)スライドです。

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

JUnit5とAndroidのテスト

  1. 1. JUnit5とAndroidのテスト @kikuchy
  2. 2. Who? @kikuchy 菊池紘 株式会社Diverse (ミクシィグループ) 今月からAndroidエンジニアに復帰しました
  3. 3. JUnit5でAndroidのテストをする
  4. 4. できませんでした
  5. 5. 以上
  6. 6. 以上
  7. 7. JUnit5の便利機能をなるべくAndroidがらみ のテストで使う @kikuchy
  8. 8. JUnit5とは 言わずと知れたJavaのテストフレームワークの最新版 10年以上メジャーアップデートしていなかったらしい 機能がモジュール化されている そのためにJUnit4から全部書き直したらしい Java8以降をターゲットにしている ラムダ式、Interfaceのデフォルト実装などを使う部分がある JUnit4以上の使い勝手の良さ
  9. 9. Androidアプリケーションモジュールに JUnit5を使おうとすると
  10. 10. JUnit5とAndroid Gradle Pluginの相性 JUnit platform gralde pluginは java プラグインを要求する ソース見たら真っ先に自動でapply してた Android Gradle Pluginは java プラグインと共存できない  java プラグインが使用されていると前ページのエラー発生 どちらかがなんとかしてくれないと多分無理 きっとTest Support Libraryがどうにかしてくれる コンソールランチャーとか持ち出せば現時点でもどうにかなる かも?
  11. 11. JavaライブラリモジュールでJUnit5を使う
  12. 12. // プロジェクトルート or Javaライブラリモジュールのbuild.gradle buildscript { repositories { mavenCentral() } dependencies { classpath 'org.junit.platform:junit -platform-gradle-plugin:1.0.0' } } // Javaライブラリモジュールのbuild.gradle apply plugin: 'java-library' apply plugin: 'org.junit.platform.gradle.plugin'
  13. 13. //Javaライブラリモジュールのbuild.gradle dependencies { // 最低限この2つがあればいい testCompile "org.junit.jupiter: junit-jupiter-api:5.0.0" testRuntime "org.junit.jupiter: junit-jupiter-engine:5.0.0" }
  14. 14. public class CalcTest { @Test void test() { Calc c = new Calc(); assertEquals(3, c.calc(1, 2)); } }
  15. 15. 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
  16. 16. JUnit5の何がいいのか
  17. 17. パラメタライズドテストを簡単に書ける 同じロジックに対して、テストデータだけを変更して複数のテスト を行う手法 よくやるので簡単にできて欲しい JUnit4でもできるけれど簡単になった テストランナーの追加とか必要だった アノテーション付けるだけでよくなった まだExperimentalなのでAPIが変わっても文句は言えない
  18. 18. //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); }
  19. 19. テストケースに欲しい値を注入できる 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()); } }
  20. 20. アノテーションの名称がわかりやすい  @Before /  @After ‑>  @BeforeEach /  @AfterEach  各テストケース実行前後に呼ばれるやつ  @BeforeClass /  @AfterClass ‑>  @BeforeAll /  @AfterAll  各テストクラス実行前後に呼ばれるやつ 地味に嬉しいやつ
  21. 21. テストケースに任意の名称を付けられる  @DisplayName() で全角文字でも記号でも指定可能 「メソッド名が全角文字」というのが宗派的に無理な人が居る職場でも 安心 @DisplayName("A special test case") class DisplayNameDemo { @Test @DisplayName("Custom test name containing spaces") void testWithDisplayNameContainingSpaces() { } @Test @DisplayName("╯°□°)╯") void testWithDisplayNameContainingSpecialCharacters() } }
  22. 22. Androidのテストに使用できるようになった 暁にはぜひ使いたいですね
  23. 23. 発表後の追記  @ogapants さんに、AndroidアプリケーションモジュールでもJUnit5 を使えるようにするプラグインの存在を教えていただきました! https://github.com/aurae/android‑junit5 ※ Kotlinで書いたテストは検出してくれないみたい・・・?

×