2018年3月27日火曜日

Android で Parameterized テスト(JUnit4, Robolectric)を行う

JUnit4

https://github.com/googlesamples/android-testing/tree/master/runner/AndroidJunitRunnerSample
にサンプルがあります。

具体的には CalculatorAddParameterizedTest.java がテストクラスで、
テスト対象のクラスは Calculator.java です。

上記のサンプルを見ればだいたいわかるのですが、Kotlinで書いた以下のFizzBazzをテストしてみたいと思います。 class FizzBazz { fun fizzbazz(value: Int): String { return when { value % 15 == 0 -> "fizzbazz" value % 3 == 0 -> "fizz" value % 5 == 0 -> "bazz" else -> value.toString() } } }
  • 1. テストクラスに @RunWith アノテーションで Parameterized を指定する。
  • 2. Parameterized テストで使う値をコンストラクタの引数として受け取り保持する。
  • 3. @Parameters アノテーションをつけた static メソッドを用意する(つまり @JvmStatic が必要)。このメソッドではコンストラクタ引数に対応した値の配列のIterableを返す。
  • 4. 保持した値を使ってテストする。
/** * @RunWith で Parameterized を指定する * * Parameterized テストで使う値をコンストラクタの引数として受け取る * ここでは fizzbazz() に渡す値と、fizzbazz()の戻り値の期待値の2つを引数として受け取る */ @RunWith(Parameterized::class) class FizzBazzParameterizedTest( private val value: Int, private val expected: String ) { private lateinit var fizzBazz: FizzBazz @Before fun setUp() { fizzBazz = FizzBazz() } @Test fun testFizzBazz() { assertThat(fizzBazz.fizzbazz(value)).isEqualTo(expected) } companion object { /** * @Parameters と @JvmStatic をつける * @return [Iterable] コンストラクタに渡す値のIterableを返す */ @Parameters @JvmStatic fun data(): Iterable<Array<Any>> { return listOf( arrayOf(1, "1"), arrayOf(2, "2"), arrayOf(3, "fizz"), arrayOf(4, "4"), arrayOf(5, "bazz"), arrayOf(15, "fizzbazz") ) } } }

テスト結果




Robolectric

BlockJUnit4ClassRunnerWithParameters を継承した Runner であれば、@Parameterized.UseParametersRunnerFactory でその Runner を返す ParametersRunnerFactory を指定することで、その Runner で Parameterized テストを実行することができます。

RobolectricTestRunner は SandboxTestRunner を継承しているためこの方法は使えません。 代わりに Robolectric には ParameterizedRobolectricTestRunner が用意されています。


TextUtils を使った次の EmptyChecker をテストしてみます。 class EmptyChecker { fun isEmpty(value: String?): Boolean { return TextUtils.isEmpty(value) } } 使い方は Parameterized とほぼ同じです。
違いは @RunWith に ParameterizedRobolectricTestRunner を指定することと、@ParameterizedRobolectricTestRunner.Parameters を使うことです。 /** * @RunWith で ParameterizedRobolectricTestRunner を指定する * * Parameterized テストで使う値をコンストラクタの引数として受け取る * ここでは isEmpty() に渡す値と、isEmpty()の戻り値の期待値の2つを引数として受け取る */ @RunWith(ParameterizedRobolectricTestRunner::class) class EmptyCheckerParameterizedTest( private val value: String?, private val expected: Boolean ) { private lateinit var emptyChecker: EmptyChecker @Before fun setUp() { emptyChecker = EmptyChecker() } @Test fun testFizzBazz() { assertThat(emptyChecker.isEmpty(value)).isEqualTo(expected) } companion object { /** * @ParameterizedRobolectricTestRunner.Parameters と @JvmStatic をつける * @return [Iterable] コンストラクタに渡す値のIterableを返す */ @ParameterizedRobolectricTestRunner.Parameters @JvmStatic fun data(): Iterable<Array<Any?>> { return listOf( arrayOf<Any?>(null, true), arrayOf<Any?>("", true), arrayOf<Any?>("a", false) ) } } }

テスト結果




0 件のコメント:

コメントを投稿