Android Spekでユニットテスト書いてみた
まえがき
Kotlin Advent Calendar 2017 - Qiitaの14日目です。
ユニットテストを書く時に、もっといい感じに書きたいっと思う時があります。 そんなとき、Spek - A Kotlin Specification Framework for the JVMを発見しました。Androidで試してみました。
Androidでの導入は最後に書きます。
まずはSpekとJUnit4でのソースをみてみます。
Kotlin前提ですが、デフォルトはもうKotlinでいいよね?
比較
テスト対象
class SampleCalculator { fun sum(x: Int, y: Int): Int = x + y fun subtract(x: Int, y: Int): Int = x - y }
Spekで書いてみる
@RunWith(JUnitPlatform::class) object SampleCalculatorSpekTest : Spek({ describe("SampleCalculatorのテスト") { val calculator = SampleCalculator() on("足し算") { val sum = calculator.sum(2, 4) it("2+4が6になるテスト") { assertEquals(6, sum) } } on("引き算") { val subtract = calculator.subtract(4, 2) it("4-2は2になるテスト") { assertEquals(2, subtract) } } } })
JUnitで書いてみる
JUnit4で同じことをすると以下のようなソースになります。
@RunWith(Enclosed::class) class SampleCalculatorTest { class 足し算 { lateinit var calculator: SampleCalculator @Before fun setup() { calculator = SampleCalculator() } @Test fun `2足す4が6になるテストになるテスト`() { assertEquals(6, calculator.sum(2, 4)) } } class 引き算 { lateinit var calculator: SampleCalculator @Before fun setup() { calculator = SampleCalculator() } @Test fun `4引く2が2になるテストになるテスト`() { assertEquals(2, calculator.sum(4, 2)) } } }
まとめ
良い点
- テストを日本語で書く場合、JUnitの場合は、エスケープしないといけない文字があり少し不便だったのが不要になった
- classのネストで全体的に長かったのが短くなった
- コンテキストを固定したテストがしやすくなった
悪い点
- 設定仕方が悪いのか、Spekを使わないテストが動かなくなってしまった
Android Spekの導入方法
app/build.gradleに以下を追加します。
dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testImplementation 'junit:junit:4.12' testImplementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" testImplementation "org.jetbrains.spek:spek-junit-platform-engine:1.1.5" testImplementation('org.jetbrains.spek:spek-api:1.1.5') { exclude group: 'org.jetbrains.kotlin' } testImplementation "org.junit.platform:junit-platform-runner:1.0.0" }
Android StudioにSpekプラグインをインストールする
補足
もちろんAndroid Studioからではなくコマンド./gradlew testで実行できます。
※わざと失敗するようにテストケースを修正しました。
./gradlew test > Task :app:testDebugUnitTest com.kamedon.speksample.SampleCalculatorSpekTest > on 足し算.it 2+4が6になるテスト FAILED java.lang.AssertionError 2 tests completed, 1 failed FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:testDebugUnitTest'. > There were failing tests. See the report at: file://...../SpekSample/app/build/reports/tests/testDebugUnitTest/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. * Get more help at https://help.gradle.org BUILD FAILED in 1s 19 actionable tasks: 1 executed, 18 up-to-date
結果がファイルにはき出されるので、見返しやすくてうれしいです。