CodeZine(コードジン)

特集ページ一覧

Visual Studioで作るデータドリブンテスト

Visual Studio 単体テスト機能大全(4)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2011/09/06 14:00
目次

操作手順

 作業を開始する前に、今回テスト対象としているメソッドを確認しておきます。これはリスト1のようになっています。なお、各リストでは参考情報として、本稿に付属の作業後のサンプルファイルにある対象ファイル名を示します。

[リスト1]テスト対象となるメソッド(ClassLibrary1のDataDrivenClass.cs)
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のようになります。

[リスト2]Calculateメソッドの単体テスト(TestProject1のDataDrivenClassTest.cs)
/// <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のように名前は既定のままで[追加]ボタンをクリックしてファイルを追加します。

図1 アプリケーション構成ファイルの追加
図1 アプリケーション構成ファイルの追加

 設定情報が何も記載されていないアプリケーション構成ファイルが開いた状態になるので、ここにデータドリブンテストを行うための設定をリスト3のように記述します。

[リスト3]アプリケーション構成ファイルの編集(ClassLibrary1のApp.config)
<?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を確認してください。

表1:Excelに定義するデータ
要素 サブ要素 属性 解説
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列のデータを持った表データを作成します。

表2:Excelに定義するデータ
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のように定義されています。

[リスト4]データドリブン単体テスト(ClassLibrary1のDataDrivenClassTest.cs)
/// <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プロジェクトにこのファイルを含ませます。

図2 data.xlsファイルのプロジェクトへの追加
図2 data.xlsファイルのプロジェクトへの追加

 データの追加が完了したら、次はこのデータを利用するため、先ほど作成してあった単体テストを書き換えます。書き換えを行った単体テストはリスト5のようになります。

[リスト5]データドリブン単体テスト(ClassLibrary1のDataDrivenClassTest.cs)
/// <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)。

図3 配置の有効化
図3 配置の有効化

 最後に[適用]ボタンをクリックして設定は終了です。これで全ての作業が完了しました。実際に作成した単体テストを実行すると、図4に示すようにいつも通りの成功/失敗の表示結果を得ることができます。

図4 データドリブンテストの実行結果
図4 データドリブンテストの実行結果

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Visual Studio 単体テスト機能大全

著者プロフィール

  • WINGSプロジェクト りばてぃ(リバティ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5