Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト
Visual Studio 2005
Visual Studio 2008 開発ガイドブック

第 7 章 単体テスト

ここまでに、プロジェクトの新規作成、ユーザー インターフェイス デザイン、処理ロジックのコーディング、ビルド、デバッグと、一連の開発作業を紹介してきました。
ただ単にアプリケーションを開発するというだけであれば、これらの作業手順を踏むだけで十分でしょう。
しかし、品質の高いアプリケーションを開発するには、テストは欠かせない作業の 1 つです。

ただし、テストといっても、メソッド単位やクラス単位で行う「単体テスト」、複数のクラス モジュールを組み合わせた状態で行う「結合テスト」、本番に近い状態でシステム全体をテストする「システム テスト」、Web サイトに対する集中的なアクセス負荷を擬似的に発生させてその耐性を検証する「負荷テスト」、期待する機能や性能を備えているかを利用者になる予定のエンド ユーザーが検証する「受け入れテスト」など、さまざまな種類があります。
とりわけ、これらのテストのうち、最も小さな単位である単体テストは重要です。
単体テストが成功しなければ、小さな単位が組み合わさったより大きな機能単位を検証する結合テストやシステム テストが成功することは理論的にあり得ないからです (仮に成功したとしても、隠れた不具合として後々問題になる可能性が高いでしょう)。
Visual Studio 2008 では、この単体テストをプロジェクトとして作成し、実行できる機能が、(Professional Edition 以上に) 搭載されています。
以下では、この単体テストの機能について紹介します。

単体テストの作成

まずは単体テストを作成します。
通常、1 つのクラスに対して、1 つの単体テスト クラスを作成します。したがって、複数のクラスが集まった 1 つのプロジェクトに対しては、複数の単体テスト クラスを集めた 1 つの単体テスト プロジェクトを作成することになります。
単体テスト対象となるプロジェクトと単体テスト プロジェクトは別々のソリューションに含めることも可能ですが、1 つのソリューションに含めると、(単体テスト対象となるプロジェクトに含まれる) 既存のクラスのコードからそれに対応する単体テスト クラスのコードを自動生成できるので便利です。なお、単体テスト クラスの自動生成の際には、単体テスト プロジェクトも作成されます。

単体テストを作成する

実際に、既存のコードから単体テストを作成するには、単体テストを作成したクラスのコードを (ドキュメント ウィンドウの) コード エディタで表示し、そのクラス名の部分を右クリックします。
コンテキスト メニューが表示されるので、[単体テストの作成] を選択します。
これにより、[単体テストの作成] ダイアログ ボックスが表示されますので、単体テストを作成したいクラスやそのメソッド群が正しくチェックされているかを確認します。
ここで、単体テストに含めたくないメソッドなどがあればチェックは外し、逆にほかのクラスの単体テストも作成したければそのクラスにチェックを入れます。
ダイアログ ボックスの下部にある [出力プロジェクト] コンボボックスの「Visual C# テスト プロジェクトの新規作成」、「Visual Basic テスト プロジェクトの新規作成」などの中から適切なものを選択します。
なお、ソリューション内に既存のテストプロジェクトが存在する場合は、それをこのコンボボックスで選択することもできます。
最後に [OK] ボタンをクリックします。

以上の作業で、単体テスト プロジェクトが作成され、その中にチェックを入れたクラスに対応する単体テスト クラスのファイルが生成されます。
単体テスト クラスの名前は、基本的に、(単体テスト対象となるプロジェクトに含まれる) 生成元クラスの名前に続けて「Test」をたした形式になります。
たとえば、「Form1」クラスの単体テストを生成した場合には、その単体テスト クラスの名前は「Form1Test」です。
単体テスト クラス名はファイル名としても使われるので、たとえば先ほどの例の単体テスト クラスが記述されいるファイルの名前は、Visual C# のプロジェクトの場合は「Form1Test.cs」となります。
単体テスト クラスの内部に自動生成されたテスト メソッドの名前も、クラス名と同様に、生成元のクラスのメソッド名に「Test」をたした形式になります。

画面

コード エディタにおける [単体テストの作成] メニューの選択

画面

[単体テストの作成] ダイアログ ボックスによる
単体テストの作成

単体テストの内容を実装する

次に、単体テストの内容を実装します。
具体的には、単体テスト クラスのテストメソッドの内部に、対象のメソッドを検証するコードを記述します。
たとえば、対象のメソッドを呼び出して、その戻り値が期待する値と一致するかどうかを判断し、一致しない場合にはエラーであることを通知する Assert.Fail メソッドを呼び出すといったコードです。
このような検証用のコードを記述していくことで、対象のクラスと対象のメソッドが正しく動作するかどうかを確かめられるのです。

画面

単体テスト コードの記述

手動による単体テストの作成について

なお、単体テスト プロジェクトや単体テスト ファイルは手動で作成することもできます。単体テスト プロジェクトを作成するには、通常のプロジェクトの作成と同じで、[新しいプロジェクト] ダイアログ ボックスを使用します。
また、単体テスト ファイルを作成するには、メニュー バーの [テスト] - [新しいテスト] を選択します。
これにより [新しいテストの追加] ダイアログ ボックスが表示されますので、ここで「単体テスト」テンプレートを選択し、任意の [テスト名] を入力し、[テスト プロジェクトに追加] コンボボックスで既存のプロジェクト名を選択して、[OK] ボタンを押すだけです。

単体テストの実行

単体テストのコーディングが完了したら、その単体テストを実行します。

すべての単体テストを実行する

最も簡単に単体テストを実行するには、メニュー バーから [テスト] - [実行] - [ソリューションのすべてのテスト] を選択することです。
これにより、ソリューション内にある単体テスト プロジェクトのすべての単体テストが実行されます。

[テスト ビュー] ウィンドウで実行する

しかし、現実的には現在開発している部分の単体テストだけを選択的に実行したいというケースがほとんどではないでしょうか。
このようなケースで手軽に単体テストを実行するには、[テスト ビュー] ウィンドウを使います。
[テスト ビュー] ウィンドウは、メニュー バーの [テスト]- [ウィンドウ] - [テスト ビュー] を実行すると表示されます。
[テスト ビュー] ウィンドウには、ソリューション内にあるすべての単体テスト クラスに実装されたすべてのテスト メソッドがリスト形式で表示されます。
リストの行をクリックすると、その行が選択されます。Ctrl キーを押しながらクリックすると、複数の行を選択できます。
また、Shift キーを押しながら 2 つの行をクリックすると、その 2 つの間のすべての行が選択されます。
このようにして実行したいテスト メソッド (の行) を選択して、[テスト ビュー] ウィンドウの上部の左端にある [選択範囲の実行] ボタンを押します。
これにより、選択していた単体テストのみが実行されます。

画面

[テスト ビュー] ウィンドウによる
単体テストの実行

[テスト リスト エディタ] ウィンドウで実行する

[テスト ビュー] ウィンドウで選択的に単体テストを実行できるのはわかりましたが、毎回決まり切ったテストメソッドを多数選択するような場合では、そのたびに [テスト ビュー] ウィンドウで選択し直すのは面倒です。
1 回選択したテスト メソッドの組み合わせを保存したいという要望は少なくないでしょう。
これを実現するのが [テストリスト エディタ] ウィンドウです。
[テスト リスト エディタ] ウィンドウは、メニュー バーの [テスト] - [ウィンドウ] - [テスト リスト エディタ] を実行すると表示されます。

画面

[テスト リスト エディタ] ウィンドウによる単体テスト

テストの実行

[テスト リスト エディタ] ウィンドウは、テスト メソッドの組み合わせを「テスト リスト」として扱います。
よってまずは、テスト リストを作成する必要があります。
これには、メニュー バーの [テスト] - [新しいテスト リストの作成] を選択し、[新しいテスト リストの作成] ダイアログ ボックスを表示します。
[新しいテスト リストの作成] ダイアログ ボックスでテスト リストの [名前][説明] などを入力し、[OK] ボタンを押してテスト リストを作成します。
作成したテスト リストは、基本的には [テスト リスト エディタ] ウィンドウ内の左側にあるツリー内の「テストの一覧」ノードの直下に追加されます。
追加されたノードを選択した状態で、右側のリスト部分にテストメソッドを追加していきます。
追加するには、先ほどの [テスト ビュー] ウィンドウ内のリストの行 (テスト メソッド) を、[テスト リスト エディタ] ウィンドウのリスト部分にドラッグ アンド ドロップするだけです。
この際、複数の行を選択して、一気に追加することもできます。以上でテスト リストの作成は完了です。

後はこのテスト リストを実行します。
これには先ほど「テストの一覧」ノードの配下に追加したノードの左にあるチェック ボックスにチェックを入れ、[テスト リスト エディタ] ウィンドウの上部の左端にある [選択されたテストを実行] ボタンを押します。
これにより、選択していたテスト リスト内の単体テストすべてが実行されます。

単体テストの結果の確認

単体テストが無事に実行できたら、そのテスト結果を確認します。
これには [テスト結果] ウィンドウを使用します。[テスト結果] ウィンドウは単体テスト実行後に自動的に表示されます。手動で表示するには、メニュー バーの [テスト] - [ウィンドウ] - [テスト結果] を実行します。

[テスト結果] ウィンドウでは、単体テストのテスト メソッドの実行結果がリスト形式で各行に表示されます。実行結果の種類には、緑色の「成功」や、赤色の「失敗しました」、黄色の「エラー」などがあります。
失敗した内容の詳細を確認するには、その行をダブル クリックします。
これによって、ドキュメント ウィンドウにテスト結果の詳細が表示されます。
そのテスト結果の [エラーのスタック トレース] 欄にあるソース ファイルへのリンクをクリックすると、単体テストに失敗した問題のコード箇所にジャンプできます

画面

[テスト結果] ウィンドウによる
単体テストの実行結果の確認

リファクタリング

最後に、単体テストと関連が深い、リファクタリングについて触れておきましょう。
リファクタリングとは、途中の仕様変更やバグ修正などにより冗長になってしまったコードを、すっきりとした読みやすいコードに書き直すことです。
このようなコードの改善を行うのは、冗長なコードをそのまま放置しておくと、後から保守しようとしても容易にはできないコードになってしまう、コードの内容を解読しにくいがゆえにそれが原因で新たなバグを作ることになってしまう、というような問題が発生する可能性を低減させるためです。
しかし、そんなに簡単にコードを書き直しても大丈夫なのでしょうか。
一昔前は「動いているコードは触るな」を格言とする開発者が多くいました。
実際に、要らぬコード修正を加えたがために新たなバグを生んでしまったという事例は、枚挙にいとまがありません。
このような事態に陥らないためには、書き直しの前と後でコードの振る舞いが変わらないことを保証する必要があるのです。

ここで使われるのが単体テストです。
たとえばメソッドのコード内容を書き直す場合、そのメソッドの単体テストの実行結果が、書き直し後も以前と変わらずに成功するのであれば、「コードは書き換えられても、振る舞い自体は何も変わってない」ということが証明されたことになります。

このように、リファクタリングを行うには、あらかじめ適切な単体テストが用意されていることが不可欠です。
単体テストがあって初めて、開発者は安心して勇気を持ってリファクタリング、つまりコードの改善に取り組めるのです。
このことは非常に重要です。
コード変更による副作用を引き起こさないためにも適切な単体テストを用意せずに、むやみにリファクタリングをしてしまわないように気を付けましょう。
Visual C# では 7 つのリファクタリング機能が搭載されています (Visual Basic では「名前の変更」のみがサポートされています)。
もっとも、実際にリファクタリングによるコードの改善を行うには、たった 7 つのリファクタリング機能だけでは足りないことが多いでしょう。
しかし、Visual C# のリファクタリング機能を活用すれば、リファクタリングにより必要となるコードの書き直しを、ソリューション全体にわたって自動的に正確に行ってくれるので、やはり使わない手はありません。
たとえば機能の追加、変更によってメソッド名が適切でなくなった場合に実施する「名前の変更」はちょっとした変更に思えますが、実際にはそのメソッドを参照している他のコードを変更する必要があります。
Visual Studio 2008 のリファクタリング機能では、このような依存関係を持つコードに対しても適切な変更を実施します(依存関係を持つコードが同一ソリューションに含まれている必要があります)。

Visual C# でリファクタリング機能を使用するには、コード エディタ上のメソッド名などを右クリックして、コンテキスト メニューから [リファクタ] の配下のメニューを選択します。
もしくは、コード エディタ上のメソッド名の部分などにテキスト カーソル (キャレット) を置いたまま、メニュー バーの [リファクタ] の配下のメニューを選択します。Visual C# で利用可能なリファクタリングのメニューは、次の表を参考にしてくさだい。

メニュー
名機能の説明
名前の変更
メソッドやクラスなどの名前を変更する際に、そのメソッドやクラスを使用しているコードも一緒に変更します
メソッドの抽出
メソッド内の一部のコードを新たなメソッドとして切り出します
フィールドのカプセル化
クラス内の public フィールド変数を private 変数にカプセル化して、その変数にアクセスする方法をプロパティ経由に変更します
インターフェイスの抽出
複数のクラスで共通のメソッドを利用したい場合に、そのクラスのメソッド定義を、インターフェイスのメソッド定義として抽出します
ローカル変数をパラメータに昇格
メソッド内部で宣言されているローカル変数を、メソッドのパラメータに変更します
パラメータの削除
メソッドのパラメータを削除します
パラメータの順序の再変更
メソッドのパラメータの順番を変更します

なお、Visual Basic で「名前の変更」のリファクタリングを使用するには、コード エディタ上のメソッド名などを右クリックして、コンテキスト メニューから [名前の変更] を選択するか、メソッド名の部分などにテキストカーソル ( キャレット) を置いたまま、メニュー バーの [データ] - [リファクタ] - [名前の変更] を選択します。

▲ Top of Page



Microsoft