編集可能

デフォルトでテスト成功にするという 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
goyo @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
goyo @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
残りを読む(8)

コメント

せとあず @setoazusa 2011年5月22日
自分の感想を追加しました。
0
せとあず @setoazusa 2011年5月22日
頂いた情報等を追加。後並び替えさせていただきましたm(__)m
0
Takuto Wada @t_wada 2011年5月22日
発言を少し足しました
0
MOROHASHI Kyosuke @moro 2011年5月22日
RSpecでもデフォルト成功ですね。見たことあるのでは、"間違って"アサーション走らないように書いている例。it { var.should_not nil }のような。RSpecの文法的にテストが流れず、失敗もしません。微妙。
0
山本康彦@BluewaterSoft @biac 2011年5月23日
NUnit も MSTest(Visual Studio内蔵) も、デフォルト成功。 RED → GREEN が身に付いてると何とも思わないんだけど。現場で、Assert 無しのテストコードを見せつけられるとねぇ…。
0
山本康彦@BluewaterSoft @biac 2011年5月23日
じゃ、デフォルト成功が悪かと言うと…。スパイク打つには便利なんだよね。API 呼んでみて結果をコンソールで確認したいだけ、なんて時には、Assert は書きたくない。
0
椎路ちひろ @ChihiroShiiji 2011年5月23日
assertionなしのテストを書いて良しとするって発想はなかったなー。笑話かと思ったら実在なのか…。まぁ自分で書いてる場合はともかく、他人に書いてもらう場合を考えるとそういう事例があり得るというのは知っておいてもいいか…。
0