はじめに
Visual Studio 2005 Team System(以下、VSTS)には製品の品質を向上させる上で非常に有効なさまざまなテスト自動化の機能が付属しています。それらの機能の概要は「Visual Studio 2005 Team Systemを使ってみよう-第3回 単体テストからパフォーマンス分析まで、VSTDでシステム開発を自動化しよう」で述べましたが、具体的な操作や実際に使用するうえでの注意点、さらにVSTSの連携機能を活かした使い方までは触れていませんでした。
そこで今回はテスト自動化の機能のうち、Visual Studio 2005 Team Edition for Software DevelopersおよびVisual Studio 2005 Team Edition for Software Testersに用意されている単体テスト機能について、操作方法と効果的な使い方を紹介します。
対象読者
- .NET Frameworkを利用した開発プロジェクトに携わっている人
- Visual Studio 2005 Team Systemに興味がある人
- 単体テストに興味がある人
必要な環境と準備
- Visual Studio 2005 Team Edition for Software DevelopersまたはVisual Studio 2005 Team Edition for Software Testersがインストールされていること(一部の内容にはVSTTの機能が必要な部分があります)。
とりあえず単体テストを作ってみよう
単体テストはテスト対象のメソッドを呼び出し、予測値と同じ値が返ってくるかどうかを判断するテストです。VSTSの単体テストにはいくつかの機能がありますが、まずは具体的な使用方法と注意点について見ていきましょう。
VSTSの単体テストを使用する際、始めに行うことはテストプロジェクトを追加することです。VSTSでは単体テストはすべて専用のプロジェクト内に記述するのでテスト対象のソースコードに手を加える必要はありません。テストプロジェクトは通常のプロジェクトを追加するようにソリューションエクスプローラから追加できます。
このテストプロジェクト内に単体テストを記述していくわけですが、すべてを自分自身で実装するわけではなく、テストコードの雛形部分は自動生成することができます。雛形を作成したい場合は、まず単体テスト対象としたいソースコード上で右クリックし、「テストの生成」を選択します(図1)。立ち上がってきたウィンドウの任意のテスト対象を選択することでテストクラスやテストの雛形を自動生成できます(図2)。
Subtractionという引数同士の引き算を行うだけの単純なメソッドのテストコードを自動生成すると次のような雛形が出来上がります。
///<summary> ///Subtraction (int, int) のテスト ///</summary> [TestMethod()] public void SubtractionTest() { Calculater target = new Calculater(); int i = 0; // TODO: 適切な値に初期化してください int j = 0; // TODO: 適切な値に初期化してください int expected = 0; int actual; actual = target.Subtraction(i, j); Assert.AreEqual(expected, actual, "CodeZineSample_UnitTest_VSTD.Calculater.Subtraction は 予期する値を返しませんでした。"); Assert.Inconclusive("このテストメソッドの正確性を確認します。"); }
自動生成されたコードには[TestClass]
や[TestMethod]
といった属性によってテスト専用のコードであることが明記されています。この属性を持つことで、テストマネージャといったVSの画面上から任意のテストを実行できるようになります。
雛形の中身ですが、テスト対象のコードが呼び出され、戻り値をAssertクラスのメソッドの第2引数として使用していることがわかります。Assertクラスのメソッドは大抵、第1引数に期待値を、第2引数に実際の戻り値を指定し、第1引数と第2引数が一致するかどうかを判断します。第3引数も指定することができ、第1引数と第2引数が一致しなかった場合のエラーメッセージを指定します。また、対象のメソッドでの例外を検証したい場合は属性に[ExpectedException]
を使用することで例外の検証ができます。
最後の1行にAssert.Inconclusive(“このテストメソッドの正確性を確認します”)
というコードがありますが、このコードはテストが未実装であることを示すコードで、このコードがあるとテストは成功しません。テストの実装が完了した場合はこのコードを必ず削除してください。
また、以前の記事でも述べましたが、プロジェクトを分けてしまったことにより、privateやinternal(Visual BasicではPrivateやFriend)アクセス修飾子が付与されたメソッドへのアクセスができないかと疑問に思われるかもしれません。しかしVSTSではprivateやinternalメソッドへの単体テストの雛型を作成すると同時にプライベートアクセッサが作成され、作業者が特に意識しなくともこれらのメソッドにアクセスし、テストを作成することができます。
プライベートアクセッサとは、privateやinternal修飾子が付与されて別アセンブリからはアクセスできないメソッドに対して、.NET Frameworkのリフレクション機能を利用してメソッドの呼び出しを行い、結果を取得するための手順が書かれたメソッドのことを指します。なお、プライベートアクセッサが作成された場合にはテストプロジェクトに「VSCodeGenAccessors.cs」(Visual Basicでは「VSCodeGenAccessors.vb」)というファイルが作成され、テストプロジェクト内で必要なすべてのプライベートアクセッサが格納されています。