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.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'
//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"
}
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で書いたテストは検出してくれないみたい・・・?
JUnit5とAndroidのテスト
JUnit5とAndroidのテスト
JUnit5とAndroidのテスト
JUnit5とAndroidのテスト

JUnit5とAndroidのテスト