操作手順
作業を開始する前に、今回テスト対象としているメソッドを確認しておきます。これはリスト1のようになっています。なお、各リストでは参考情報として、本稿に付属の作業後のサンプルファイルにある対象ファイル名を示します。
public int Calculate(int x, int y, Operator operation)
{
int result = 0;
switch (operation)
{
case Operator.Add:
//足し算が指定された
result = x + y;
break;
case Operator.Sub:
//引き算が指定された
result = x - y;
break;
case Operator.Multi:
//掛け算が指定された
result = x * y;
break;
case Operator.Div:
//割り算が指定された
//割る数が0ではないときに計算を行う
if (y != 0)
{
result = x / y;
}
break;
default:
break;
}
return result;
}
メソッドの引数にoperationというものがありますが、これは独自に定義したOperator列挙体を受け取るためのもので、この引数の条件に応じて計算方法が変わるというだけのシンプルなメソッドになっています。このメソッドなどの一式は付属の事前のサンプルファイルに含まれています。
次に、今までと同様にリスト1のメソッドをテストする単体テストを作成します。とりあえずの作成となるため、単純に成功するパターンの単体テストを作成しておきます。これはリスト2のようになります。
/// <summary>
///Calculate のテスト
///</summary>
[TestMethod()]
public void CalculateTest()
{
DataDrivenClass target = new DataDrivenClass();
int x = 1;
int y = 2;
Operator operation = Operator.Add;
int expected = 3;
int actual;
actual = target.Calculate(x, y, operation);
Assert.AreEqual(expected, actual);
}
単体テストが作成できたら念のため、テストを実行して成功することを確認しておきます。テストの作成までが完了したら、ここからはデータドリブンテストを行っていくための作業に入ります。
まず、テストプロジェクト(サンプルファイルではTestProject1)にアプリケーション構成ファイルを追加します。ソリューションエクスプローラーでテストプロジェクトのコンテキストメニューから[追加]-[新しい項目]を選択し、開いたウィンドウで[アプリケーション構成ファイル]を選択します。図1のように名前は既定のままで[追加]ボタンをクリックしてファイルを追加します。
設定情報が何も記載されていないアプリケーション構成ファイルが開いた状態になるので、ここにデータドリブンテストを行うための設定をリスト3のように記述します。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- 構成ファイル内でmicrosoft.visualstudio.testtools要素を利用できるように定義 -->
<configSections>
<section name="microsoft.visualstudio.testtools"
type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection,
Microsoft.VisualStudio.QualityTools.UnitTestFramework,
Version=10.0.0.0,
Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
</configSections>
<!-- データドリブンテストのデータソースへの接続文字列を定義 -->
<connectionStrings>
<add name="ExcelConnection"
connectionString="Dsn=Excel Files;
dbq=data.xlsx;
defaultdir=.;
driverid=790;
maxbuffersize=2048;
pagetimeout=5"
providerName="System.Data.Odbc"/>
</connectionStrings>
<!-- 単体テストで利用するデータソースの設定を定義 -->
<microsoft.visualstudio.testtools>
<dataSources>
<add name="MyExcelDataSource"
connectionString="ExcelConnection"
dataTableName="Sheet1$"
dataAccessMethod="Sequential"/>
</dataSources>
</microsoft.visualstudio.testtools>
</configuration>
このアプリケーション構成ファイルでは、はじめのconfigSections要素ではデータドリブンテストで利用する設定を定義するためのmicrosoft.visualstudio.testtools要素を利用できるように設定を行っています。次のconnectionStrings要素ではデータドリブンテストで利用するデータソースへの接続文字列を定義しています。最後にmicrosoft.visualstudio.testtolls要素でデータドリブンテストで利用するデータソースの設定を定義しています。それぞれの要素、属性についての補足情報は次の表1を確認してください。
| 要素 | サブ要素 | 属性 | 解説 |
| configSections | App.configファイル内で新しい要素を利用できるようにするための設定グループ | ||
| section | App.config内で利用したい新しい要素の定義を行うための要素 | ||
| name | App.config内で利用したい新しい要素の名前 | ||
| type | 新しい要素がプログラムから読み込まれる際にその処理を担当する独自クラスの厳密名 | ||
| connectionStrings | データベース等の外部リソースへの接続文字列を定義するための設定グループ | ||
| add | 新しい外部リソース接続文字列を追加するための要素 | ||
| name | プログラムから接続文字列を識別するための名称 | ||
| connectionString | 外部リソースへの接続文字列の定義 | ||
| providerName | 接続文字列を処理するプロバイダーの定義 | ||
| microsoft.visualstudio.testtools | Visual Studioテストツールの動作を定義するための設定グループ | ||
| dataSources | 単体テスト等のテスト内で利用するデータソースを定義するための設定グループ | ||
| add | 新しいデータソースを追加するための要素 | ||
| name | テストプログラムからデータソースを識別するための名称 | ||
| connectionString | connectionStrings要素に定義された名称から選択するデータソースへの接続文字列 | ||
| datatableName | 接続文字列を利用して抽出した表のうち、データソースとして利用する表の名称 | ||
| dataAccessMethod | データソースへのアクセス方法(シーケンシャルまたはランダム) | ||
アプリケーション構成ファイルの設定が完了したら、接続文字列で定義したdata.xlsファイルを作成します。今回はExcelを利用するので、新しいExcelファイルを開き、表2に示すように4列のデータを持った表データを作成します。
| x | y | operation | result |
| 1 | 2 | 0 | 3 |
| 10 | 2 | 1 | 8 |
| 2 | 2 | 2 | 4 |
| 5 | 2 | 3 | 2 |
| 5 | 0 | 3 | 0 |
この表に定義しているのは、DataDrivenClassのCalculateメソッドに渡す引数、x, y, operationの値と計算結果の期待値となるresultの4つのデータとなっています。なお、operation列の値はClassLibrary1プロジェクトに定義されたOperator列挙体の値に変換するよう後述の処理を作成する予定です。このOperator列挙体はリスト4のように定義されています。
/// <summary>
/// DataDrivenClassのCalculateメソッドで計算方法を指定するための列挙体
/// </summary>
public enum Operator
{
/// <summary>足し算を指定する</summary>
Add, // = 0
/// <summary>引き算を指定する</summary>
Sub, // = 1
/// <summary>掛け算を指定する</summary>
Multi, // = 2
/// <summary>割り算を指定する</summary>
Div // = 3
}
この組み合わせを好きなように作成することで全てのパターンでのテストが可能となる仕組みになっています。Excelの編集が完了したら「data.xls」という名前でファイルを保存し、図2のようにVisual StudioのTestProject1プロジェクトにこのファイルを含ませます。
データの追加が完了したら、次はこのデータを利用するため、先ほど作成してあった単体テストを書き換えます。書き換えを行った単体テストはリスト5のようになります。
/// <summary>
///Calculate のテスト
///</summary>
[TestMethod()]
[DeploymentItem("TestProject1\\data.xls")]
[DataSource("MyExcelDataSource")]
public void CalculateTest()
{
DataDrivenClass target = new DataDrivenClass();
//data.xlsファイルのSheet1に定義された x 列の値をint型で読み込む
int x = Int32.Parse(this.TestContext.DataRow["x"].ToString());
//data.xlsファイルのSheet1に定義された y 列の値をint型で読み込む
int y = Int32.Parse(this.TestContext.DataRow["y"].ToString());
Operator operation;
//data.xlsファイルのSheet1に定義された operator 列の値をOperator列挙体の列挙子に変換して読み込む
Enum.TryParse<Operator>(this.TestContext.DataRow["operation"].ToString(), out operation);
//data.xlsファイルのSheet1に定義された result 列の値をint型で読み込む
int expected = Int32.Parse(this.TestContext.DataRow["result"].ToString());
int actual;
actual = target.Calculate(x, y, operation);
Assert.AreEqual(expected, actual);
}
メソッドの中身は、Calculateメソッドに渡す引数x, y, operationのそれぞれを外部に用意したデータから取得するように変更しています。また、結果を確認するexpectedについても外部に用意したデータから取得するように変更しています。これらの書き換えによって、データの組み合わせに基づくテストを行うことができるようになります。Excelからの場合、読み取ったデータは文字列として取得されるので、int型へ変換するInt32.Parseメソッドや指定した列挙体の対応する列挙子への変換を行う、Enum.TryParseメソッドなどを利用して、それぞれ必要な型のデータを取得しています。
さらにメソッドの宣言部分にも変更を行っています。2つの属性が付与されていて、1つ目のDeploymentItem属性は、data.xlsをテストを実行する際のディレクトリにコピーするための設定です。2つ目のDataSource属性はこの単体テストで使うデータソースの名前を定義するためのもので、アプリケーション構成ファイルに設定したMyExcelDataSourceを利用することを定義しています。
ここまででデータドリブンテストを行うための編集作業は完了しましたが、最後にもう1つ、data.xlsを正しく配置できるようにするための設定を行う必要があります。ソリューションエクスプローラーの「Solution Items」フォルダ内にある「Local.testsettings」ファイルをダブルクリックして開きます。テストの設定画面が表示されたら、左側のメニューから[配置]を選択し、右側に表示された中から[配置を有効にする]にチェックを入れます(図3)。
最後に[適用]ボタンをクリックして設定は終了です。これで全ての作業が完了しました。実際に作成した単体テストを実行すると、図4に示すようにいつも通りの成功/失敗の表示結果を得ることができます。



