『知識ゼロから学ぶソフトウェアテスト』 あるいは 無残なるノーテスト

Java で プログラミングをしている場合に、テストケースの作成に JUnit を ベースにテストしているケースがあるかと思います. “Assert that X is Y.” の 考え方 を 基本に isnotnullValue などしてテストケースを書いていくよいライブラリと思うのですが…

テスト も カバレッジ も ちゃんと やってます!

それは昔々の事、とあるアプリケーションに携わった人のお話しで機能追加することから物語は始まりました. (いや物語らん話しのがよかた)

このアプリケーション、しっかりテストケースが作ることになっており、なんと C0 カバレッジ 90% 以上、C1 も 努力目標ながら高レベルでされているとのことでした. ちゃんとテストするフレンズなんだね!すごーい!(2017年2月現在 流行りのフレーズ)

と、聞いていたのも束の間、コードを触り始めると気になる謎の実装、不思議なテストケース…
「テストなってないじゃん?」いや、まぁ、「テストするとは」の定義は何かと自問自答するわけですが、テストケースがあるとか、カバレッジが取れてるとかでなくて、「何を検証したいのか」じゃないのかなぁと、考えたとのことです.
僭越ながら同感です. いたずらにカバレッジだけとっても、通過させるためだけの意味のないテストケースの実行コードなんてものがあふれることもあり得ます.

え? その “verify(x, never()).y()”…

さて、そんな中、聞かれたのが “verify(x, never()).y()” というコード. これだけ聞かれてもよくわからないのですが、たぶんモックでメソッドの呼び出し有無を判定したいと思われます.

そして出てきたのが以下のようなテストケース. (※ ポスト用に命名等を汎化させています)

1
2
3
4
5
6
public class DaoTest {
@Test public void testAdd() {
verify(dao, never()).findAll();
}
// ...(省略)
}

いゃ~! 見たくなかった、聞きたくなかった…
たぶん、Deta Access Object = DAO の テストケースと思われます.
きっと、新しいレコード を 追加 = add するのをテストしたかったのでしょう. 知らんけど.
verify()never() は モックを簡単にするためのライブラリから、メソッドの実行確認をしているのでしょう.
だけど、dao.add() 実行してないじゃん? あと findAll() しなくね?、どう考えても. (そもそも Dao の 処理を何も実行してないからアレだけど) White Box テストだから知ってるはずだし?

どうして、そうなったのか. 少し話を聞いたたらしいのですが、「テストって、何をテストをするんですか?」「どうやるんですか?」「できすか?やって見せてください!」…
えーっと、逆ギレ? DAO とかテストめんどくさいの分かるけど、単純 な Getter/Setter だけのテストだってできてないんですが (T_T

1
2
3
4
5
6
7
8
public class ModelTest {
@Test public void setParam() {
Model model = new Model();
model.set("あああ..."); // ※ すごい長い「あ」が続く
assertEquals("あああ...", model.get());
// ※ この後、同様のパターンで半角英数、記号、全半角の組み合わせ? などが続く
}
}

なお、C0 90% は、どっか別のテストケースで実行していたのが、たまたま通過していたものだったとか. 対となるテストケースの実行では無残なカバレッジ率とのこと… はあぁ 全部作り直しかよ~と、ご愁傷様です ( ̄人 ̄)
ひゃ~ こわい、こわい.

“assertTrue(true)” ?

そんな今となっては香ばしい昔話を黄泉がえらせたのが、Titter に 流れてきた衝撃のツイート.

“assertTrue(true)”… 何を言っているのかわかりませんでいた. いや TDD とかで、Fake it、ですよね~ やるやる~~www と…

いや、ヤバいです. どういう話しですか?
先の昔話も 今も テストの闇は深い… (“JUnit 目視” という、別系統のヤバいのも見た気が)

『知識ゼロから学ぶソフトウェアテスト』

テストで悩んだら『知識ゼロから学ぶソフトウェアテスト』を 読んでみるのがよいかと思った次第で、ちょうどアプリケーションのテストの不備に、”assertTrue(true)” という闇の呪文、半額セールが重なったので、勢い投稿を書いてしまいました!

こちらの書籍は JUnit とかの実装技術ではないのですが、「テストとは」という視点で書かれています. テストに対する考え方を学ぶことができるのではないでしょうか. いきなりテストケースを実装する前に、何を、どうやってテストするのかを知ってから、作るとよいかと思います.

私は改訂版の前の書籍を読んだことがありますが、テストケースはどう作るべきかの基礎をしっかり学ばせていただきました. 改訂版とのことで、どう変わったのかは改めて読みたいと思いますが、基本的な考え方を知るにはよいと思います.


「テストって何をするんだろ」には『知識ゼロから学ぶソフトウェアテスト』も よいと思いますので、よかったら ご参考までに.