Visual Studio 2008単体テスト機能のすべて:特集:Visual Studio 2008単体テスト機能徹底活用(前編)(3/4 ページ)
VS 2008でProfessional版にも搭載されるようになった単体テスト機能。具体的にはどのようなテストが可能なのか?
■CSVファイル/データベースのデータによるテスト
前の例のように、1つのメソッドに対して複数の値でテストを実施したい場合、CSVファイルやデータベースのデータを使用した「データ駆動テスト」と呼ばれるテストを実施することが可能だ。まずは、CSVファイルを使用したテストについて解説していこう。
最初にCSVファイルを作成する。Excelなどで作ってもいいが、今回はVisual Studioで作っていこう。メニューバーの[ファイル]−[新規作成]−[ファイル]をクリックし、[新しいファイル]ダイアログから「テキスト ファイル」を作成する。
そして1行目にヘッダ行を入力し、2行目以降にデータを入力していく。通常は、次の画面のように入力値と出力値をセットで入力しておくとよい。入力が終わったら、「テスト名+Data.csv」のように分かりやすい名前を付けてファイルを保存する。
CSVファイルが作成できたら、次にテスト・メソッドとの関連付けを行う。
これには、メニューバーの[テスト]−[ウィンドウ]−[テスト ビュー]により[テスト ビュー]ウィンドウを表示する。テストの一覧が表示されるので、対象のテスト・メソッドを選択すると、[プロパティ]ウィンドウにテスト・メソッドのプロパティが表示される。
[プロパティ]ウィンドウの「データ接続文字列」を選択して右端の[...]ボタンをクリックすると、[テスト データ ソース作成ウィザード]が表示されるので、以下の要領でテスト・プロジェクトにCSVファイルを取り込む。
「CSV File」を選択して[次へ]ボタンをクリック
作成したCSVファイルを指定して[完了]ボタンをクリック
[Yes]ボタンをクリックするとテスト・プロジェクトにCSVファイルがコピーされるテスト・データ・ソース作成ウィザードによるCSVファイルの設定
最後の確認ダイアログでは、メッセージが「データベース ファイル」となっているが、今回の場合はCSVファイルのことを意味している。
ここまでの手順を実施すると、テスト・メソッドに以下の属性が付加される。
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\GetAgeTestData.csv", "GetAgeTestData#csv", DataAccessMethod.Sequential), DeploymentItem("TestProject1\\GetAgeTestData.csv"), TestMethod()]
もともとあったTestMethod属性のほかに、DataSource属性、DeploymentItem属性が追加されている。
DataSource属性は、テストを実施するために必要なデータソースを識別するために使用される。パラメータは順に、データソースに対するプロバイダ名、ファイルのパス、テーブル、アクセス方法である。
そして、テスト・メソッドは次のようにして記述する。
01: /// <summary>
02: ///GetAge のテスト
03: ///</summary>
04: [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\GetAgeTestData.csv", "GetAgeTestData#csv", DataAccessMethod.Sequential), DeploymentItem("TestProject1\\GetAgeTestData.csv"), TestMethod]
05: public void GetAgeTestDB()
06: {
07: ClassLibrary2.Class1 target = new ClassLibrary2.Class1();
08: System.DateTime birthday
= (System.DateTime)TestContext.DataRow["Birthday"];
09: System.DateTime targetDate
= (System.DateTime)TestContext.DataRow["TargetDate"];
10: int expected = (int)TestContext.DataRow["Age"];
11: int actual;
12: actual = target.GetAge(birthday, targetDate);
13: Assert.AreEqual(expected, actual,
(string)TestContext.DataRow["Description"]);
14: }
7〜10行目を見ると、入力値および期待値をTestContext.DataRowから取得していることが分かる。そして、13行目のAssert.AreEqualメソッドの第3パラメータにテストの説明用のデータを渡して、エラーが発生したときにどのテストで失敗したのかが分かるようになっている。このテストはCSVファイル内のデータ数分繰り返し実行されるが、ループなどを記述する必要はなく、通常のテストと同じように記述することができる。
もう1つ特徴的なのが、TextContext.DataRowから値を取得する際に、データの変換ではなくキャストを行っている点だ。データソースがCSVファイルなので、通常はデータに型を指定できないが、単体テスト機能が自動的に適切と思われる型に変換しているのである。
意図しない型に変換されてしまう場合もあるが、そのときは次のように一度文字列として取得してから値を適切な型に変換するとよい。
int value = int.Parse(TestContext.DataRow["Age"].ToString);
想定外の型に変換された値は、一度文字列に変換してから、適切な型に変換する。
さて、テスト・コードの記述が完了したら次に実行である。実行結果は次のように(中央ウィンドウに表示されるテスト結果の)[データ ドリブン テスト結果]として、1つのテストに対し複数表示される。
CSVファイルのほかにも、データベースやXMLファイルを使用することもできるが、もう1つ特徴的なのがSQL ServerのExpress Editionで提供されている動的なデータベース・ファイル(.mdfファイル)のアタッチが使えることだ。
従って、データベース・サーバにテスト・データを用意しなくても、CSVファイルと同じようにウィザードで設定していくことで、以下のような属性が追加されて、.mdfファイルを動的にアタッチしたテストを実施できる。
[DeploymentItem("TestProject1\\UnitTestData.mdf"),
DataSource("System.Data.SqlClient", "Data Source= .\\SQLEXPRESS;AttachDbFilename= |DataDirectory|\\UnitTestData.mdf;Integrated Security= True;Connect Timeout= 30;User Instance= True", "GetAgeData", DataAccessMethod.Sequential), TestMethod]
SQL Server Express Editionの機能を使うことで、.mdfファイルを動的にアタッチし、そこからテスト・データを取得することができる。
このように、CSVファイルやデータベースなどに格納したテスト・データを使用することで、効率的に単体テストを実施できる。
Copyright© Digital Advantage Corp. All Rights Reserved.