はじめに
こんにちは。 Andpadのモバイルアプリの開発を担当しているzigeninです。 2019年の11月頃から、モバイルアプリにテストコードを少しずつ追加しています。
Androidでは、どのようなテストケースの名だと読みやすいのか、自分の中では答えが出ました。それは、テストケース名を全て日本語で記述してしまうことです。日本語だと微妙なニュアンスを短く正確に表現できるからです。
テストケース名の具体例
たとえば、以下のkotlinメソッドがあったとします*1。
/* * Todoリストの項目を渡すと、作業中のタスクの割合と完了したタスクの割合を返す。 */ internal fun getActiveAndCompletedStats(tasks: List<Task>?): StatsResult { return if (tasks == null || tasks.isEmpty()) { StatsResult(0f, 0f) } else { ... } }
このメソッドの引数tasksにnullを渡した場合、(0f, 0f)を返すのが期待動作です。 ここでは、そのテストコードのテストケース名として、3つのスタイルを示します。
- 筆者が最近まで書いていたスタイル
- "testGetActiveAndCompletedStatsReturnsZerosWhenTasksIsNull"
- Google CodeLab流儀
- "getActiveAndCompletedStats_error_returnsZeros"
- 全て日本語のスタイル
- "Todoリストがnullのとき、作業中と完了したタスクの割合は両方0とする"
最初のスタイルは、昔ながらのtest<Method名>というスタイルを意識したものです。今どき、先頭にtestを付けるのはナンセンスらしいです。また、切れ目が良く分からないので可読性が低いです*2。
2番目のスタイルは、Google CodeLabの流儀です。1番目に比べると、単語の切れ目が分かりやすく、可読性が高いです。
最後のスタイルは、テスト対象メソッドも含めて全て日本語で書いたものです。他のスタイルよりもテスト内容が分かりやすいと感じています。これを英語で記述しようとしたら、"bothActiveRatioAndCompleteRatio_are_zero_if_tasks_is_null"のようになると思います。この英語の記述だとひと目見ても意味が分からないのと、そもそも英語的に正しいのか謎な点が問題です*3。
まとめ
環境が許せば*4、テストケース名は全て日本語で記述するのが分かりやすいと思っています。 最後に、本記事の主張は、まだ個人的な考えの段階です。
補足
JUnit5について
AndpadのAndroidアプリではJUnit4を使っていますが、JUnit5からメソッド名とは別に表示名(@DisplayName)を付けられるようになりました。JUnit5を使っているなら、メソッド名は英語にしておいて、表示名に日本語を付けたほうが良さそうです。
iOSについて
XCTestの仕様上、iOSではテストケース名の先頭に"test"を付ける必要があります。 "test"を先頭に付ければ、日本語も普通に記述できます。 メソッド名に日本語入れるのは嫌だが、日本語の説明文がどこかしらには表示されて欲しいなら、XCTContext.runActivityを使えば実現できます。
*1:元ネタはGoogle CodeLabです
*2:今にしてみれば、camelCaseにこだわらないで、"_"を入れれば、大分ましになったのですが
*3:筆者の英語力の問題な気がしますが
*4:日本語ネィティブの方が多い環境