Yabu.log

ITなどの雑記

「テスト駆動開発」読書会 Vol.7 に参加

テスト駆動開発

テスト駆動開発

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 のコピーが面倒ではないか?という話題が登りました。

ようです。

リファクタリングの工数

リファクタリングの工数を確保する(顧客と合意を取る)のが難しいのでは?と言う話題をあげました。

  • 黙ってやるべき
    • 現場がレビュー&エクセルで管理されている場合、機能改修以外のマージは無理
  • リファクタリングは製造の一部。それ独自で工数としない。

そして以下の動画をご紹介いただきました。

和田卓人のTDD講座 #17

www.nicovideo.jp

t_wadaさんによると、「リファクタリングで開発やバグ改修が早くなる」と言うメリットで顧客と合意をとり リファクタリングの工数を確保するとよい(例:全体の工数の20%等)、とのこと。

グースのTDD本

お勧めとして話題に上がりました

実践テスト駆動開発 (Object Oriented SELECTION)

実践テスト駆動開発 (Object Oriented SELECTION)

*1:間違ってたらごめんなさい

*2:リフレクションのようなもの