- 作者: Kent Beck,和田卓人
- 出版社/メーカー: オーム社
- 発売日: 2017/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
29章から32章まで読みました
assertionのないテスト-例外のテスト
以前参加した勉強会でassertionのないテストはアンチパターンだ、との話がありました。
本書の第29章の「例外のテスト」がまさにassertがないテストでした。 ですのでこの話題をあげて見ました。
@Test public void testMissingRate() { try { exchange.findRate("USD", "GBP"); fail();//findRateで例外が発生すればこの行に達しない。 } catch (IllegalArgumentException expected) { } }
例外のテスト
帰宅後調べて見たら例外をテストする方法は
- try-fail-catchのイディオム(TDD本記載)
- 例外をcatchのブロックでassertionする
- アノテーションで確認する
の3つがあることがわかりました。(なぜか最後の方法は成功しませんでした) サンプルを作って試して見ました。
※以下のテストの中のkti.toInteger()はString型の数値を表す数字または漢字を引数にとり
Integer型を返しますkti.toInteger("一九"); //19
@DisplayName("例外系のテスト") class 例外{ @DisplayName("例外確認(TDD本にあったver)") @Test void 数値でない漢字が来た時の例外のテスト() { try{ kti.toInteger("数値でない"); fail(); }catch(Exception e) { } } @DisplayName("例外確認(Assertを使うver)") @Test void 数値でない漢字が来た時の例外のテスト2() { try{ kti.toInteger("数値でない"); fail(); }catch(Exception e) { assertEquals(NumberFormatException.class, e.getClass()); } } @Rule public ExpectedException expectedException = ExpectedException.none(); @DisplayName("例外確認(annotationを使うver)") @Test void 数値でない漢字が来た時の例外のテスト3() { expectedException.expect(java.lang.NumberFormatException.class); //throw new NumberFormatException(); kti.toInteger("数値でない"); }
Assertionのないテストがダメな理由
私が件の勉強会できちんと話を理解して聞いていなかったため、話題はそこで中断しました。
今思えば、テストは(成功/失敗)のどちらかの状態が必ず発生する必要があり、 assertionのないテストは必ず成功する=原則に反するから、なのではないか?と考えます。*1
テスト名が長くなる
状況ごとにテストクラスを分割する方法が良いそうです。
Javaでは@Nested
アノテーションでクラスを入れこにすることにより、テストクラスを分類できます。
テストコードを書いて見ました。
https://github.com/yuyabu/KanjiToInteger/blob/master/KanjiToInteger/src/TestKanjiToInteger.java
value objectのコピーは?
本書でデザインパターンについて触れられている箇所がありますが、エバンス本とかに書かれているvalue object のコピーが面倒ではないか?という話題が登りました。
- PHPならマジックメソッドを使う*2
- JavaならBeanUtils.copyPropertiesでメンバのコピーができる
ようです。
リファクタリングの工数
リファクタリングの工数を確保する(顧客と合意を取る)のが難しいのでは?と言う話題をあげました。
- 黙ってやるべき
- 現場がレビュー&エクセルで管理されている場合、機能改修以外のマージは無理
- リファクタリングは製造の一部。それ独自で工数としない。
そして以下の動画をご紹介いただきました。
和田卓人のTDD講座 #17
t_wadaさんによると、「リファクタリングで開発やバグ改修が早くなる」と言うメリットで顧客と合意をとり リファクタリングの工数を確保するとよい(例:全体の工数の20%等)、とのこと。
グースのTDD本
お勧めとして話題に上がりました
実践テスト駆動開発 (Object Oriented SELECTION)
- 作者: Steve Freeman,Nat Pryce,和智右桂,高木正弘
- 出版社/メーカー: 翔泳社
- 発売日: 2012/09/14
- メディア: 大型本
- 購入: 4人 クリック: 262回
- この商品を含むブログ (31件) を見る