デフォルトでテスト成功にするという JUnit の設計判断とその功罪について

32
Takuto Wada @t_wada

デフォルトでテスト成功にするという JUnit の設計判断とその功罪について考えたい。

2011-05-22 16:01:39
Hideki Kishida @quicy

自分用のC用ユニットテスターは、アサーションなしの場合はエラーにしていた。

2011-05-22 16:03:10
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada デフォルトで成功には違和感を覚えますね。。。故にIDEのJUnit自動生成ではスケルトンコードで失敗するようになっているんでしょうけど。一番怖いのがリファクタリング時にもし何かassertを消してしまった場合にも成功するというのが。

2011-05-22 16:05:24
Takuto Wada @t_wada

@kyon_mm リファクタリングで assertion を消すことがあるかは疑問ですが、デフォルト成功というところには予想以上に多くの初心者が足を取られているようですね。

2011-05-22 16:11:01
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada JUnit使い始めた人ってデフォルトで成功というのを気にしていないので、リファクタリング時の確認がかなりおろそかになっています。(それがPGとしてダメという話もありますが。

2011-05-22 16:14:42
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

JUnitのデフォルト成功がいい点ってあまり無いよね。。。mainメソッドつくるの面倒だから@Testで実行させてみるとかはあるかもしれないけど、それにしたって。。。

2011-05-22 16:21:27
Takuto Wada @t_wada

@kyon_mm いま言っているリファクタリングとはテストのリファクタリングですか?

2011-05-22 16:23:15
せとあず @setoazusa

@kyon_mm デフォルト、というのは?assertが1回も呼ばれなかったらfailってこと?

2011-05-22 16:22:51
せとあず @setoazusa

@kyon_mm 面白いけどJUnitではテストケースとassertメソッドは実装が独立している、というのが原則だからな−。そうしないとカスタムアサーションが作りづらくなっちゃう。

2011-05-22 16:30:50
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@setoazusa そうなんですよねー。そのおかげ?でGroovyでもJUnitを楽に拡張できたんだろうなーとは思っていますし、自分でも作りやすいんだろうなーって。で、JUnit4からはアノテーションで区別できなかったのか。とたまに思うのです。

2011-05-22 16:37:13
Hideki Kishida @quicy

自分でユニットテストフレームワークを作ってみて分かったのは、テストランナー、テストクラス、アサーションを別々に設計して、独立性を高めた結果、テストはデフォルト成功扱いになる感じ。ランナーとアサーションの結合を受け入れることで、デフォルト失敗に修正した。

2011-05-22 16:28:36
Takuto Wada @t_wada

@quicy なるほどなるほど! @setoazusa さんも言っていますが、結合度、拡張性などとのトレードオフ関係を考えた上での設計判断なのですかね。つぶやいてみてよかったです。

2011-05-22 16:36:57
goyoki @goyoki

assertを全く書かず、基準以上のコードカバレッジとjunitがグリーンという結果でテスト完了、と判断してしまう現場が出てきてるからなー >デフォルトグリーン

2011-05-22 16:33:42
Hideki Kishida @quicy

Assertionフリーテスト問題は、「テストの進捗をとりあえず上げたい」という欲望に根ざしているので、デフォルト失敗にしてもassertTrue(true)とかやっちまうんじゃないだろうか。

2011-05-22 16:38:37
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

JUnit4は@Testだとデフォルト失敗で@TestDefaultSuccessだとデフォルト成功。とかにしてほしかった。

2011-05-22 16:38:56
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@TestDefaultSuccessは原則禁止とかプロジェクトで決めればいいわけで。使うときはコメントなり仕様書に反映なりなんなり的な。

2011-05-22 16:40:56
Hideki Kishida @quicy

Assertionフリー問題は、前職でリアルに経験しました。それを経験するまでは、テストツールをデフォルト失敗にはしなかったと思う。テストツール作る側にとって「まさかそんなことあるわけw」という頭は、どうしてもあったなぁ...。

2011-05-22 16:41:58
goyoki @goyoki

@t_wada もしかしたら成功、失敗の他に、テスト無しみたいな結果があればいいですねー

2011-05-22 17:25:17
sue445 @sue445

@goyoki @t_wada テストケースのあるコードをリファクタリングしててassertがコメントアウトされていた時の絶望感と言ったら、、、、

2011-05-22 17:33:22
安心沢ガブ美 @gab_km

JUnitはテストがデフォルトで成功しちゃうのね。NUnitもそうだったような。

2011-05-22 18:26:01
せとあず @setoazusa

JUnitのデフォルト成功という挙動をかえるのは無理なので、もしやるなら静的解析の出番なんだろうな。

2011-05-22 19:48:54
wtnabe, yet another yak shaver @wtnabe

もともとTDDの教えを先に知ったのでJUnitのデフォルトGREENに違和感は特になかったり。PHPで書くときはまずREDにするところまでを準備と受け入れている。

2011-05-22 19:50:35