![]() |
特集:Visual Studio 2008単体テスト機能徹底活用(前編)Visual Studio 2008単体テスト機能のすべて尾崎 義尚2008/11/14 |
|
|
Visual Studio 2005(以下、VS 2005)では上位エディションであるTeam Developerでのみ利用可能だった単体テスト機能が、Visual Studio 2008(以下、VS 2008)からは、Professional Editionでも利用可能になった。
VS 2008の1機能として導入されるほど単体テストが脚光を浴びるようになったのは、やはりアジャイル開発の普及だろう。アジャイルで開発する場合、単体の品質が非常に重要になる。また、リファクタリングなどで繰り返しテストが必要になるケースが多いため、テストを自動化するという考えが生まれ、単体テストの注目度はさらに増している。
本稿では、このVS 2008 Professional Editionに搭載されている単体テスト機能で何が可能になったのかを解説していく。
なお、本稿ではテスト・ファーストやアジャイル開発などの開発手法にはあまり深入りせず、あくまでもVS 2008の単体テスト機能に注目して解説していく。
単体テストとは?
単体テストとは、その名前のとおり、全体ではなく単体に対して行うテストのことである。とはいえ、「単体」の定義は厳密にされているわけではない。
例えば、汎用機の世界ではモジュールに対するテストを単体テストと呼んできたし、Webアプリケーションでは、ページに対するテストを単体テストと呼んだりする。Visual Studioにおける単体テスト機能では、メソッド、もしくはクラスに対するテストを単体テストと呼んでいる。
また、単体テストには2通りのテスト方法がある。
1つは、完全に入力値/出力値にのみ着目した「ブラックボックス・テスト」である。この方法は、コードの中身を意識せず、処理のあるべき姿を想定してテスト・コードを記述する。コードを実装した本人以外の第三者、もしくはコードを実装した本人が第三者的な視点でテスト・コードを記述する方法である。
実装に依存せずにテスト・コードを記述するため、より俯瞰(ふかん)した視点からコードを考えることができる。一般的に、詳細設計レベルの要件が満たされていることを確認する作業である。本稿で解説しているVS 2008 Professional Editionの単体テスト機能は、このブラックボックス・テストを行うためのものだ。
もう1つは、コードの内部構造に着目してテスト・コードを記述する「ホワイトボックス・テスト」である。この方法では、分岐やループなど、上から下に処理が流れるのではなく状態によって変化する部分に着目してテスト・コードを記述する。
この方法により単体テストを実施する場合、コード・カバレッジとの組み合わせが最適であるため、VS 2008の上位エディションであるVisual Studio Team System 2008を検討するか、サード・パーティ製品と組み合わせて使うことをお勧めする。本稿では、ホワイトボックス・テストについてはこれ以上触れない。
VS 2008単体テスト機能のすべて
それではVS 2008の1機能としてIDEに統合された単体テスト機能は具体的にどのようなものなのか。実際に使いながら、まずはその基本的な機能から見ていこう。
■単体テスト・クラスを作成してみよう
VS 2008の単体テスト機能はIDEに統合されているため、非常に効率的にテストを作成することができる。まずは、単純な"足し算メソッド"を作って、そのテストを実施してみよう。
クラス・ライブラリを作成して、足し算メソッドを以下のように記述する。
![]() |
| VS 2008で記述した足し算メソッド |
次に、いま記述したクラスの中でマウスを右クリックし、メニューから[単体テストの作成]を選択する。
![]() |
| コンテキスト・メニューから[単体テストの作成]をクリック |
以下のような[単体テストの作成]ダイアログが表示されるので、単体テストを作成したいメソッドにチェックを入れて[OK]ボタンをクリックする。
![]() |
| [単体テストの作成]ダイアログ |
これだけでテストの枠組みがテスト・プロジェクトとして作成され、現在のソリューションに追加される。次にテスト・コードを実際に書いていこう。
■テスト・コードを書いてみよう
単体テストを作成すると、以下のコードが自動生成される。
| ||
| 単体テストの作成で自動生成されるテスト・メソッド(上:C#、下:VB) |
コメントで「TODO」と書かれている部分が、これから実施しなくてはならない作業である。7行目は、テスト対象の足し算メソッドを含むクラスをインスタンス化しているが、このクラスではコンストラクタのパラメータがないため、変更せずにこのまま使用する。もし、コンストラクタのパラメータによってメソッドの処理が変わる場合には、ここで適切な値を渡す必要がある。
8〜9行目では、メソッドに渡す引数を初期化している。ここではテストを実施するために適切な値で初期化するようにする。10行目は、expectedという変数名からも分かるように、期待する戻り値である。あらかじめ、期待する値で初期化しておく。11行目はactual、つまり実際の戻り値を受け取る変数である。12行目で実際にメソッドを実行して、13行目で期待値と実際の値が一致しているかどうかを判定している。
14行目は、Inconclusiveというメソッドが呼ばれているが、これはテスト・メソッドが実装されていない状態を表すものである。この記述があると、単体テストは失敗する。これは、実装を忘れていたテスト・メソッドの実行で、テストがパスされることを防ぐ役割を果たしている。テスト・コードの実装が終わった時点で、この行を削除することで、正しく単体テストを実施できるようになる。
以下にテスト・コードを記述したテスト・メソッドを示す。
| ||
| テスト・コードを実装したテスト・メソッド(上:C#、下:VB) | ||
| 入力値の初期化(8〜9行目)、期待値の初期化(10行目)が記述されて、14行目にあった、Assert.Inconclusiveメソッドの呼び出しが削除されている。 |
■テスト・コードを実行してみよう
テスト・プロジェクトを開いていると、[テスト ツール]ツールバーが表示されるので、ここからテストの実行を開始できる([テスト]メニューからも実行可能)。テストのデバッグを実行すると、テスト・コードにブレークポイントを設定して、デバッグを行うことができる。
| [テスト ツール]ツールバー |
テストを実行すると、[テスト結果]ウィンドウに進ちょく状況が表示された後、テストの実施結果が表示される。
そして、テストが成功すると緑のチェック・アイコンが、失敗すると赤い[×]アイコンが表示される。また、Assert.Inconclusiveメソッドを残したままにしている場合、オレンジ色の[?]アイコンが表示される。
![]() |
| テストの進ちょく状況と結果 |
| Assert.Inconclusiveメソッドを残したままにしていると、オレンジ色の[?]アイコンが表示される。 |
テストに失敗した場合、[テスト結果]ウィンドウにもエラー原因が表示されるが、その行をダブルクリックすることで、より詳細なエラー情報を表示できる。
![]() |
| エラー情報ページ |
書いたテスト・コードを試しに実行してみたい場合など、すべてのテストではなく一部だけを実行したい場合には、[テスト ビュー]ウィンドウを開き(メニューの[テスト]−[ウィンドウ]−[テスト ビュー]で表示される)、実施したいテストを選択してから、([テスト ビュー]ウィンドウの)ツールバー部分にある[選択範囲の実行]または、[選択範囲のデバッグ]をクリックするとよい。
![]() |
| [テスト ビュー]ウィンドウによる一部のテストの実行 |
| テストを選択して([テスト ビュー]の)ツールバー部分のボタンから実行することで、一部のテストのみを実施することができる。 |
■テスト・コードを見てみよう
ご覧いただいたとおり、テスト・コードを記述し、メソッドが正しく動作するかどうかを確認するというのが、基本的なテストの機能である。
では、テスト・コードについてもう少し深く見てみよう。以下がテスト・クラスの全体像になる。
| ||
| テスト・クラスの全体像(自動生成されたコード)(上:C#、下:VB) |
まず、1行目でテスト対象のクラスを含む名前空間がusing(VBでは、Imports)ディレクティブで宣言されている。
次に、9行目でテスト・クラスの前に「TestClass」属性、15行目でテスト・メソッドの前に「TestMethod」属性が付与されていることが分かる。これらの属性を付与することで、テスト・メソッドとして動作するようになる。TestMethod属性のほかにも、さまざまなテストの属性が提供されているが、これについては後半で紹介する。
| INDEX | ||
| Visual Studio 2008単体テスト機能徹底活用(前編) | ||
| Visual Studio 2008単体テスト機能のすべて | ||
| 1.単体テスト・クラスの作成/テスト・コードの記述&実行 | ||
| 2.さまざまな種類のテスト(1) | ||
| 3.さまざまな種類のテスト(2) | ||
| 4.さまざまな種類のテスト(3) | ||
| Visual Studio 2008単体テスト機能徹底活用(後編) | ||
| VS 2008単体テスト機能でテスト駆動開発/NUnitからの移行 | ||
| 1.テスト駆動開発に挑戦 | ||
| 2.NUnitとの互換性 − NUnitのプロジェクトをVS 2008に移行 | ||
| 3.名前空間と属性の修正/クラスの初期化と後処理を行うメソッド | ||
ホワイトペーパー(TechTargetジャパン)
- .NET TIPS - .NET開発のテクニックとヒント集 - (2010/3/18)
− GridViewコントロールを階層表示させるには?
− Windowsフォームのボタンに画像を表示するには?
− C#でnullチェックを簡潔に行うには? - Chapter15:LINQとクエリ式 (2010/3/17)
C# 3.0の目玉機能であるLINQについて、さまざまな記述例を交えながら徹底解説。書籍『[完全版]究極のC#プログラミング』より転載 - VBラムダ式 基礎文法最速マスター (2010/3/16)
今度はVB。ラムダ式の基礎文法を、短い説明と簡単なコードでまとめる。「ラムダ式、どう書くんだっけ?」という場合の簡易リファレンスとして活用できる - ASP.NET MVC 2がリリース (2010/3/15)
ASP.NET MVC 2の正式版(VS 2008のASP.NET 3.5向け、VS 2010には標準で含まれる予定)のリリースについてのお知らせ
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 「いつかは壊れるサーバ」そんな故障に 迅速で安価に手軽に対応する方法とは? New! |
| 「特権ユーザー」の事件を防げ! 万能権限を持つユーザーの管理方法とは? New! |
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | TomcatやJBossなどAPサーバ環境に関する 情報を集約! “業務”用APサーバ大百科 New! |
| ◆ | 一気に解説! 最新のクラスタストレージ 「RAIDを超えたストレージ基準」……など New! |
| ◆ | クラウド的ユーザー体験の変化は脅威か? 仮想化技術を使いこなす運用管理術を紹介 New! |

| ◆ | 上司や部下、部署内メンバーとの情報共有 を“ガラッ”と変えるコラボツールとは? New! |
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |

| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |
| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |

| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |
| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |

| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |













