junit5とandroidのテスト

Post on 23-Jan-2018

2.653 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

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で書いたテストは検出してくれないみたい・・・?

top related