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