KotlinでJUnit5を使ってデータドリブンテストを整備する
今回は自身で開発・運営している「Hello Books」で利用している技術について紹介したいと思います。
Hello Booksについて
- エンジニア向け技術書レビューサービス
- 購入前の判断にエンジニアのレビューを役立てることができる
- アカウントを作成することで自身もレビューを投稿したり、技術書をブックマークしたりできる
- 詳細な条件による技術書の検索が可能
@ParameterizedTest
・@MethodSource
でデータドリブン化
業務ではPHPを使っているのですが、DDD(ドメイン駆動設計)でValueObjectの単体テストを記述する際にはPHPDocを利用したデータドリブンにテストを記述しています。Kotlinでも同じ様にデータドリブンテストを実現する方法がないかなと探していたところ、JUnit5の@ParameterizedTest
アノテーションを使うことで簡単に記述できることが分かりました。
JUnitでは@Test
を記述することでテストケースを作成することができますが、データドリブンなテストケースを作成する場合には@ParameterizedTest
を記述します。
class BookTitleTest {
@ParameterizedTest
@MethodSource("dataProvider")
fun testValidation(value: String, isValid: Boolean) {
when (isValid) {
true -> assertDoesNotThrow { BookTitle(value) }
false -> assertThrows<ConstraintViolationException> { BookTitle(value) }
}
}
companion object {
@JvmStatic
fun dataProvider() = listOf(
// 正常系
Arguments.of("test title", true),
Arguments.of("a", true),
Arguments.of("a".repeat(50), true),
// 異常系
Arguments.of("", false),
Arguments.of("a".repeat(51), false)
)
}
}
上記の様にすることで、dataProvider
メソッドをソースとするデータドリブンテストとしてtestValidation
を記述することができます。
dataProvider
メソッドではtestValidation
テストで受け取る2つの引数として渡す値を設定します。今回は1つ目の引数Value
をString、2つ目の引数isValid
をBooleanとして設定しているので、設定する値はArguments.of("test title", true)
の様になります。 任意の数のデータを任意の型としてソースから受け取ることができるのはとても便利ですね。
テストを実行して、各パラメータのテスト結果を確認してみます。IntelliJでは各ケースで渡された値とそのテスト結果を一目で確認することができます。
Kotlinで記述する際の注意点
とてもシンプルに利用できる@ParameterizedTest
ですが、Kotlinで利用する際には2つ注意点があります。
①ソースメソッドをcompanion object
として記述する
@MethodSource
として設定されるメソッドはstatic
として記述される必要があります。Kotlinではstatic
が存在しないため、代替方法としてcompanion object
としてソースになるメソッドを記述する必要があります。
②ソースメソッドに@JvmStatic
を記述する
Kotlinでcompanion object
として記述されたメソッドはJavaとして扱われる際にCompanion
クラスを経由しないとアクセスすることができません。今回の例で言うと、ソースメソッドにアクセスするにはBookTitleTest.Companion.dataProvider()
とする必要があるわけです。このままではJavaが「BookTitleTest.dataProvider()
どこにもないよ、、」と困ってしまうので、@JvmStatic
アノテーションを付記してあげる必要があります。こうすることで、Companion
を経由しなくてもメソッドを呼び出せる様になります。
まとめ
どうしてもデータドリブンテストを書きたくて、TestNGなどの外部フレームワークを利用しなくちゃダメかなと思い調べていたところ、JUnit5であれば非常に簡単に実現できて感動しました。皆様もぜひお試しください!
Author And Source
この問題について(KotlinでJUnit5を使ってデータドリブンテストを整備する), 我々は、より多くの情報をここで見つけました https://qiita.com/Takuyaaaa/items/0557fd6af1a5699ca63c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .