Visual Studio 2008単体テスト機能のすべて特集:Visual Studio 2008単体テスト機能徹底活用(前編)(3/4 ページ)

» 2008年11月14日 00時00分 公開
[尾崎義尚,]

■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: }

CSVデータを使用したテスト・コード

 7〜10行目を見ると、入力値および期待値をTestContext.DataRowから取得していることが分かる。そして、13行目のAssert.AreEqualメソッドの第3パラメータにテストの説明用のデータを渡して、エラーが発生したときにどのテストで失敗したのかが分かるようになっている。このテストはCSVファイル内のデータ数分繰り返し実行されるが、ループなどを記述する必要はなく、通常のテストと同じように記述することができる。

 もう1つ特徴的なのが、TextContext.DataRowから値を取得する際に、データの変換ではなくキャストを行っている点だ。データソースがCSVファイルなので、通常はデータに型を指定できないが、単体テスト機能が自動的に適切と思われる型に変換しているのである。

 意図しない型に変換されてしまう場合もあるが、そのときは次のように一度文字列として取得してから値を適切な型に変換するとよい。

int value = int.Parse(TestContext.DataRow["Age"].ToString);

テスト・データの変換
想定外の型に変換された値は、一度文字列に変換してから、適切な型に変換する。

 さて、テスト・コードの記述が完了したら次に実行である。実行結果は次のように(中央ウィンドウに表示されるテスト結果の)[データ ドリブン テスト結果]として、1つのテストに対し複数表示される。

CSVデータを使用したテストの結果
[データ ドリブン テスト結果]として、複数のテスト結果が表示される。

 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]

.mdfファイルを動的にアタッチする単体テストの属性
SQL Server Express Editionの機能を使うことで、.mdfファイルを動的にアタッチし、そこからテスト・データを取得することができる。

 このように、CSVファイルやデータベースなどに格納したテスト・データを使用することで、効率的に単体テストを実施できる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。