InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

より良いユニットテストためのガイドライン

作者 Mark Levison , 翻訳者 和智 右桂 投稿日 2009年8月2日

セクション
デベロップメント,
プロセス/プラクティス
トピック
ユニットテスト ,
Agile
タグ
Refactoring ,
テスト

原文(投稿日:20099/7/24)へのリンク

Jimmy Bogard氏は「価値あるユニットテストのために」という記事を書いており、そこで3つのルールを提示している。

  1. テストの名前はユーザの視点から見たwhatとwhyを記述しなければならない」 – この考え方は、開発者がテストの名前を読んで、意図されたふるまいがどのようなものであるかを理解できなければならないということだ。
  2. テストもコードであることには変わりないのだから、多少は愛情を注げ」 – プロダクションコードに対してしかリファクタリングを行ってはいけないわけではない。可読性の高いテストは保守も容易であり、次の人にとっても理解しやすい。「長くて複雑なテストは本当に嫌いです。初期化に30行を費やしているようなら、どうか生成メソッドの後ろに隠蔽してください。長いテストに開発者はイライラして、ディスプレイにへばりつついたままになります。プロダクションコードに長いメソッドを書かないようにしているのに、テストコードでなら許されるなどということがあるでしょうか。」
  3. 1フィクスチャを求めるパターンや組織のスタイルに決め打ちするな」 – 標準的な1クラスに対して1テストフィクスチャというパターンは、時としてうまく行かないこともある。

Lior Friedman氏はこれに次のルールを加えている。「ルール0 – 内部構造ではなく外的なふるまいをテストせよ」。つまり、クラスに対する期待値をテストするのであって現在の状態をテストするのではないということだ。

Ravichandran Jv氏はこれに自身のルールを付け加えている。

  1. 1テストに1アサーション(可能であれば)
  2. テストの内部に「if else」句があれば、分岐を個別のテストメソッドに移動せよ。
  3. テスト対象のメソッドに関して、そこにもif else分岐があったら、そのメソッドはリファクタリングするべきだ。
  4. メソッド名はテストの種類であるべきだ。たとえば、TestMakeReservationはTestMakeNoReservation()とは違う。

NUnitの作者であるCharlie Poole氏は「1テストに1アサーション」を「論理的なアサーション」と言い換え、次のように説明する。「時にテストAPIが表現力に欠けているせいで、望む結果を得るために複数の物理的なアサーションを書かなければいけないことがあります。NUnitフレームワークAPIの開発の大部分は、1つのアサーションがより多くを行えるようにする試みから生じたものでした。」

Bryan Cook氏は独自に注目すべき一覧を作っている。

  1. 必須:フィクスチャは一貫性を持って命名せよ
  2. 必須:テスト対象コードのネームスペースを模倣せよ
  3. 必須:Setup/TearDownメソッドは一貫性を持って命名せよ
  4. 要考慮:テストとプロダクションコードを分離せよ
  5. 必須:テストは機能に従って命名せよ
  6. 要考慮:期待される例外には"Cannot"という接頭語を用いよ

Cook氏は他にもたくさんのヒントを提示している。

最後に、2人がGerard Meszaros氏の書籍「xUnit Test Patterns: Refactoring Test Code」を勧めている。

なお、これまでInfoQで紹介した記事には次のものがある。Recommended TDD TutorialsDesigning for TestabilityUnit Testing Tips from GoogleTDDを根づかせる:導入の問題と解決策

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。