30 秒で単体テストの問題点を探し出す8つのテクニック

Roy Osherove 氏の投稿 “8 techniques to find problems in your unit tests within 30 seconds” より。

信頼性の点から

  • テストプロジェクトで “DateTime.” を使っているところを探してください。DateTime を使っているということは、本質的に毎回異なる単体テストを走らせていることになります。もし DateTime が原因でテストが失敗し、その時使われた値のログをとっていなければ、失敗を再現するのは困難でしょう。
  • テストプロジェクトでスレッドを使っているところを探してください。スレッドを使っていると、ロジックではなくスレッドのせいでテストが失敗してしまうでしょう。低スペックマシンやマルチ CPU のマシンで動かした時さえ、テストの動きが変わります。結合テストならよいのですが、常に同一の結果になる必要のある単体テストにとっては問題です。
  • “Environment.” を探してください(newline は除いて)。現在の環境に依存したものを使っている場合、2つのことが起こりえます。テストマシンが変わると異なるテストをすることになり、テストはプロダクションコードの中のロジックを繰り返します。代わりに、環境変数のフェイクを使い、期待値をテストコード内にハードコーディングすべきです。そうでなければ、結合テストをすべきです。

 

メンテナンス性の点から

  • Resharperを使って “.Verifiable” メソッドを探し、メンバーでグルーピングしてください。この時、テスト毎に1つであるべきです。そうでなければ、1つ以上のことについてテストしていることになります。そして、内部動作を過度に指定しているのでより脆弱なテストになってしまっています。コードの変更があったら、テストはすぐに動かなくなってしまいます。
  • Moqを使っているなら、".VerifyAll”を探してください。これも内部動作の過度な指定で、テストを脆弱で失敗しやすいものにしてしまいます。検証は1つのモックオブジェクトだけにすべきです。
  • Rhino Mocks を使っているなら、AssertWasCalled や Verify の複数回呼び出し、もしくは VerifyAll を探してください。理由は上と同じです。
  • Isolator を使っているなら、1つのテスト内で Verify を複数呼んでいるところを探してください。理由は上と同じです。
  • テスト内でテスト対象オブジェクトを生成しているところを探してください。これはリファクタリングの好機です。もしそのままにしておくと、コンストラクタに変更があった時、そのコンストラクタを使ってオブジェクトを生成している全てのテストを修正しなければなりません。

Comments

  1. Excelでデータベースの取り込みやのデータ取得/更新するなら、ExcelDBToolをお勧めします。
    テーブルのデータをエクセルに取得、更新、削除することだけではなく、複数のSQLを実行して、結果を
    一括Excelの各シートに出力することもできます。

    http://www.superdbtool.com
    ベクターからもダウンロードできます。
    Oracle,SQL Server,DB2,Sybase,MySQL,Postgre,Sqlite対応。

    使い方動画:
    http://superdbtool.com/blog/basic-guide

    またExcelDBToolを使って、本番擬似ランダムテストデータを一括作成することは非常に簡単です。
    是非お試しください。
    作成できるダミーデータ種類(69種類):
    郵便番号, 都道府県, 企業名, 市区,町村,最寄駅,最寄駅ふりがな,路線,銀行コード, 銀行名, 銀行カタカナ, 支店コード, 支店名, 支店カタカナ,E-Mail, URL, 携帯, 苗字のみ, 氏名, 住所, 住所ふりがな,性別, 年齢, 血液型, 固定電話, 婚姻, ふりがな, 大学名,身長,体重固定値,国籍,国籍英語,国籍英語略,クレジットカード会社,クレジットカード番号,有効期限,IPアドレス,業種大分類,業種大分類名称,業種中分類,業種中分類名称,業種小分類,業種小分類名称,職種大分類,職種大分類名称,職種中分類,職種中分類名称,職種小分類,職種小分類名称,数値連番,整数・小数点数,英数混在,文字列+連番,文字列+全角連番全角漢字,ひらがな,全角カタカナ,半角カタカナ,全角英数,全角数値,全角英字,全半混在日付,時間,タイムスタンプ,特殊文字

    Oracle,SQL Server,DB2,Sybase,MySQL,Postgre,Sqliteもご利用できます。

    ReplyDelete

Post a Comment

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す

WPFアプリにアニメーションGIFを表示させる