Androidのテストケース名は全て日本語が分かりやすいのでは?

f:id:zigenin:20200526143815p:plain:w128

はじめに

こんにちは。 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つのスタイルを示します。

  1. 筆者が最近まで書いていたスタイル
    • "testGetActiveAndCompletedStatsReturnsZerosWhenTasksIsNull"
  2. Google CodeLab流儀
    • "getActiveAndCompletedStats_error_returnsZeros"
  3. 全て日本語のスタイル
    • "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:日本語ネィティブの方が多い環境