方法: データ ドリブン単体テストを作成するHow To: Create a Data-Driven Unit Test

マネージ コード用の Microsoft の単体テスト フレームワークを使用して、データ ソースからテスト メソッドで使用される値を取得するための単体テスト メソッドを設定できます。Using the Microsoft unit test framework for managed code, you can set up a unit test method to retrieve values used in the test method from a data source. メソッドはデータ ソース内の各行に対して連続して実行されるため、単一のメソッドを使用してさまざまな入力を簡単にテストできます。The method is run successively for each row in the data source, which makes it easy to test a variety of input by using a single method.

データ ドリブン単体テストの作成には、次の手順が含まれます。Creating a data-driven unit test involves the following steps:

  1. テスト メソッドで使用する値を含むデータ ソースを作成します。Create a data source that contains the values that you use in the test method. データ ソースは、テストを実行するコンピューターに登録されている任意の型にすることができます。The data source can be any type that is registered on the machine that runs the test.

  2. プライベート TestContext フィールドとパブリック TestContext プロパティをテスト クラスに追加します。Add a private TestContext field and a public TestContext property to the test class.

  3. 単体テスト メソッドを作成し、それを DataSourceAttribute 属性に追加します。Create a unit test method and add a DataSourceAttribute attribute to it.

  4. DataRow インデクサー プロパティを使用して、テストで使用する値を取得します。Use the DataRow indexer property to retrieve the values that you use in a test.

テスト対象のメソッドThe method under test

たとえば、次が用意されています。As an example, let's assume that you have:

  1. さまざまな種類の勘定のトランザクションを受け入れて処理する MyBank というソリューション。A solution called MyBank that accepts and processes transactions for different types of accounts.

  2. 勘定のトランザクションを管理する BankDb という MyBank 内のプロジェクト。A project in MyBank called BankDb that manages the transactions for accounts.

  3. トランザクションが必ず銀行にとって有利になるように数値演算関数を実行する DbBank プロジェクト内の Maths というクラス。A class called Maths in the DbBank project that performs the mathematical functions to ensure that any transaction is advantageous to the bank.

  4. BankDb コンポーネントの動作をテストする BankDbTests という単体テスト プロジェクト。A unit test project called BankDbTests to test the behavior of the BankDb component.

  5. Maths クラスの動作を確認する MathsTests という単体テスト クラス。A unit test class called MathsTests to verify the behavior of the Maths class.

ループを使用して 2 つの整数を追加する Maths のメソッドをテストします。We will test a method in Maths that adds two integers using a loop:

public int AddIntegers(int first, int second)
{
    int sum = first;
    for( int i = 0; i < second; i++)
    {
        sum += 1;
    }
    return sum;
}

データ ソースの作成Creating a data source

AddIntegers メソッドをテストするには、パラメーターの値の範囲と返される必要のある合計を指定するデータ ソースを作成します。To test the AddIntegers method, create a data source that specifies a range of values for the parameters and the sum that you expect to be returned. この例では、MathsData という名前の Sql Compact データベースと、次の列の名前と値を含む AddIntegersData という名前のテーブルを作成しますIn this example, we'll create a Sql Compact database named MathsData and a table named AddIntegersData that contains the following column names and values

FirstNumberFirstNumber SecondNumberSecondNumber SumSum
00 11 11
11 11 22
22 -3-3 -1-1

テスト クラスへの TestContext の追加Adding a TestContext to the test class

単体テスト フレームワークは、データ ドリブン テストのデータ ソース情報を格納する TestContext オブジェクトを作成します。The unit test framework creates a TestContext object to store the data source information for a data-driven test. 次に、フレームワークは作成する TestContext プロパティの値としてこのオブジェクトを設定します。The framework then sets this object as the value of the TestContext property that you create.

private TestContext testContextInstance;
public TestContext TestContext
{
    get { return testContextInstance; }
    set { testContextInstance = value; }
}

テスト メソッドでは、TestContextDataRow インデクサー プロパティを使用してデータにアクセスします。In your test method, you access the data through the DataRow indexer property of the TestContext.

テスト メソッドの記述Writing the test method

AddIntegers のテスト メソッドは非常に単純です。The test method for AddIntegers is fairly simple. データ ソース内の各行に対して、パラメーターとして FirstNumber 列値と SecondNumber 列値を持つ AddIntegers を呼び出して、Sum 列値に対して戻り値を確認します。For each row in the data source, call AddIntegers with the FirstNumber and SecondNumber column values as parameters, and verify the return value against Sum column value:

[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
[TestMethod()]
public void AddIntegers_FromDataSourceTest()
{
    var target = new Maths();

    // Access the data
    int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
    int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
    int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
    int actual = target.IntegerMethod(x, y);
    Assert.AreEqual(expected, actual,
        "x:<{0}> y:<{1}>",
        new object[] {x, y});
}

Assert メソッドには、失敗したイテレーションの xy の値を表示するメッセージが含まれます。The Assert method includes a message that displays the x and y values of a failed iteration. 既定では、アサートされた値である expectedactual が失敗したテストの詳細に既に含まれています。By default, the asserted values, expected and actual, are already included in the details of a failed test.

DataSourceAttribute の指定Specifying the DataSourceAttribute

DataSource 属性は、データ ソースの接続文字列とテスト メソッドで使用するテーブル名を指定します。The DataSource attribute specifies the connection string for the data source and the name of the table that you use in the test method. 接続文字列の正確な情報は、使用しているデータ ソースの種類によって異なります。The exact information in the connection string differs, depending on what kind of data source you are using. この例では、SqlServerCe データベースを使用しました。In this example, we used a SqlServerCe database.

[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]

DataSource 属性には 3 つのコンストラクターがあります。The DataSource attribute has three constructors.

[DataSource(dataSourceSettingName)]

1 つのパラメーターを持つコンストラクターは、ソリューションの app.config ファイルに格納されている接続情報を使用します。A constructor with one parameter uses connection information that is stored in the app.config file for the solution. dataSourceSettingsName は、接続情報を指定する構成ファイル内の Xml 要素の名前です。The dataSourceSettingsName is the name of the Xml element in the config file that specifies the connection information.

app.config ファイルを使用すると、単体テスト自体に変更を加えずに、データ ソースの場所を変更できます。Using an app.config file allows you to change the location of the data source without making changes to the unit test itself. app.config ファイルの作成と使用方法については、「チュートリアル : データ ソースを定義するための構成ファイルの使用」を参照してくださいFor information about how to create and use an app.config file, see Walkthrough: Using a Configuration File to Define a Data Source

[DataSource(connectionString, tableName)]

2 つのパラメーターを持つ DataSource コンストラクターは、データ ソースの接続文字列とテスト メソッドのデータを含むテーブルの名前を指定します。The DataSource constructor with two parameters specifies the connection string for the data source and the name of the table that contains the data for the test method.

接続文字列は、データ ソースの種類によって異なりますが、データ プロバイダーの不変名を指定する Provider 要素を含んでいる必要があります。The connection strings depend on the type of the type of data source, but it should contain a Provider element that specifies the invariant name of the data provider.

[DataSource(
    dataProvider,
    connectionString,
    tableName,
    dataAccessMethod
    )]

データにアクセスするための TestContext.DataRow の使用Using TestContext.DataRow to access the data

AddIntegersData テーブル内のデータにアクセスするには、TestContext.DataRow インデクサーを使用します。To access the data in the AddIntegersData table, use the TestContext.DataRow indexer. DataRow は、DataRow オブジェクトであるため、インデックスまたは列の名前で列の値を取得します。DataRow is a DataRow object, so retrieve column values by index or column names. 値はオブジェクトとして返されるため、適切な型に変換します。Because the values are returned as objects, convert them to the appropriate type:

int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);

テストの実行と結果の表示Running the test and viewing results

テスト メソッドの記述が完了したら、テスト プロジェクトを構築します。When you have finished writing a test method, build the test project. [テストを実行しない] グループのテスト エクスプローラー ウィンドウに、テスト メソッドが表示されます。The test method appears in the Test Explorer window in the Not Run Tests group. テストを実行して、記述し、再実行すると、テスト エクスプローラーに [失敗したテスト][成功したテスト]、および [テストを実行しない] のグループの結果が表示されます。As you run, write, and rerun your tests, Test Explorer displays the results in groups of Failed Tests, Passed Tests, and Not Run Tests. [すべて実行] を選択してテストをすべて実行することも、[実行...] を選択して実行するテストのサブセットを選択することもできます。You can choose Run All to run all your tests, or choose Run... to choose a subset of tests to run.

テストの実行中は、エクスプローラーの上部にあるテスト結果バーがアニメーションで表示されます。The test results bar at the top of the Explorer is animated as your test runs. テストの実行の終了時に、すべてのテストが成功した場合はバーが緑色になり、いずれかのテストが失敗した場合は赤色になります。At the end of the test run, the bar will be green if all of the tests have passed or red if any of the tests have failed. テスト エクスプローラー ウィンドウの下部の詳細ウィンドウに、テストの実行の概要が表示されます。A summary of the test run appears in the details pane at the bottom of the Test Explorer window. テストを選択すると、そのテストの詳細が下部のペインに表示されます。Select a test to view the details of that test in the bottom pane.

この例の AddIntegers_FromDataSourceTest メソッドを実行すると、結果バーが赤に変わり、テスト メソッドは [失敗したテスト] に移動されます。データ ソースからの反復されたメソッドのいずれかが失敗した場合は、データ ドリブン テストは失敗します。If you ran the AddIntegers_FromDataSourceTest method in our example, the results bar turns red and the test method is moved to the Failed Tests A data-driven test fails if any of the iterated methods from the data source fails. テスト エクスプローラー ウィンドウで、失敗したデータ ドリブン テストを選択すると、詳細ウィンドウにはデータ行インデックスによって識別される各イテレーションの結果が表示されます。When you choose a failed data-driven test in the Test Explorer window, the details pane displays the results of each iteration that is identified by the data row index. この例では、AddIntegers アルゴリズムが負の値を正しく処理していないことがわかります。In our example, it appears that the AddIntegers algorithm does not handle negative values correctly.

テスト対象のメソッドを修正して、テストを再実行すると、結果バーが緑に変わり、テスト メソッドは [成功したテスト] グループに移動されます。When the method under test is corrected and the test rerun, the results bar turns green and the test method is moved to the Passed Test group.

関連項目See also