はむはむエンジニアぶろぐ

365日エンジニアリング

【ユニットテスト】 メソッド名をそのままテスト名にすべきではない

f:id:secret_hamuhamu:20150829180326j:plain
タイトルの通りです。
ユニットテストでメソッド名をそのままテスト名にすべきではない。
例えばこんなやつ testGetUser() みたいなメソッド名のprerfixに test をつけただけのようなやつ。
このテストメソッドを見た時に、 GetUser() メソッドをテストしているとすぐわかるので、テストが理解しやすいという考え方もあります。

でも、その考え方って正しいの?
メソッドに対してテストがあると分かる状態が正しい状態?

私自身のユニットテストのメソッド名は、こうあるべき的なことをつらつら書いていこうと思います。

何のためにテストをしているのか?振る舞いを記述せよ

先ほどの、 testGetUser() は、何のためにテストをしているのか?が分からない。
メソッド一つ一つにテストを書くことが、テストの目的かと言われるとそうではない。
ユニットテストは、ブラックボックステストなのでテスト対象のクラスが どのように振る舞うのか? という観点でテストしたほうがよい。

振る舞いをテストするということは、 GetUser() メソッドをどのような引数で、呼び出すとどのようなことが期待されるのか?ということに関心をもつ。
メソッド名をそのままテスト名にした testGetUser() では、テスト名から振る舞いが分からない。

テストから振る舞いが分かるというのは、とても大事なことでコーダとは別の開発者が 実装されたコードテストコード を読むことで、そのクラスの役割や振る舞いが見えてくる。
私はテストコードを、取扱説明書ぐらいに思っている。

1メソッドに複数のテストケースを書くこともある

更に先ほどの testGetUser() をダメ出しすると、1メソッドに1テストケースしか考えられていない。
GetUser() メソッドが、Userを返したり例外を返したり複数の振る舞いがあるのであれば、テストケースは複数用意すべきである。
そうなった場合、 testGetUser1()testGetUser2() のように意味のないナンバリングされたテストが出来てしまう。

1メソッドに1テストケースで済むのがシンプルであるが、それが良い設計かどうかは別である。
必ずしも、1メソッドに1テストケースが当てはまるわけではないというのを忘れすに。

テスト名は日本語でもええんやで

testGetUser() を日本語で、 Userを返すこと のようなテスト名にしてもよい。
日本語のほうが、日本人だし分かりやすいですよね?
プロダクトにアサインしている開発者のツールと相性が悪いとかって理由があるのなら英語のほうがいいかもしれません。
しかし、特に日本語で書いていけない理由がないのなら日本語でいいと思います。

逆にOSSのようなプロダクトだと日本語使ってはいけません。
何故なら、他国のエンジニアの参入障壁が上がってしまいます。

まとめ

テストコードは、取扱説明書なのでテスト対象もコードが、どのように振る舞うのか意識してテスト名をつけよう。

おすすめの本

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)

実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる (Object Oriented SELECTION)

テスト駆動開発入門

テスト駆動開発入門

  • 作者: ケントベック,Kent Beck,長瀬嘉秀,テクノロジックアート
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2003/09
  • メディア: 単行本
  • 購入: 45人 クリック: 1,058回
  • この商品を含むブログ (161件) を見る

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

  • 作者: 川瀬裕久,古川文生,松尾大,竹澤有貴,小山哲志,新原雅司
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/04/21
  • メディア: 大型本
  • この商品を含むブログを見る

これからはじめるTDD テスト駆動開発入門 (Think IT Books)

これからはじめるTDD テスト駆動開発入門 (Think IT Books)