ステップ 7 ハンズオン 「Visual Studio 2005 Team System によるアプリケーション品質の向上」
第 3 回 品質の高いコード作成 (2) - その 3
単体テストの実施 - データ駆動テスト
NRI ラーニングネットワーク
荒木 達也
最終更新日 2007 年 10 月 17 日
| 目標 |
Visual Studio Team System によるデータ駆動単体テストの実施 |
| 使用技術 |
- Visual Studio Team System / C#
- .NET Framework 2.0
|
| 取り上げるトピックス |
|
| 前提知識 |
|
| 関連記事 |
|
単体テスト - コード カバレッジ
今回は、「その 2 : 単体テストの実施 - コード カバレッジ」 で作成した UTMyLibs テストプロジェクトを修正し、SQL Server に存在するテストデータを参照する単体テストを実施します。

図 1. 単体テスト (データ駆動) を実施するコンポーネント
| 実装する処理 |
メソッド |
呼び出し対象 |
商品名取得処理の単体テスト (データ駆動テストへ変更) |
TestGetProductName |
MyComp1.GetProductName |
商品在庫数取得処理の単体テスト (データ駆動テストへ変更) |
TestGetProductStocks |
MyComp1.GetProductStocks |
なお、今回のテストで利用するテストデータは、SQL Server に以下のよう構成で作成しておきます。
- データベース名 : TESTDB
- テーブル名 : TESTTBL
- フィールド名 : ProductID [int]
- フィールド名 : ProductName [varchar(40)]
- フィールド名 : UnitsInStock [smallint]
※なおテストデータは、元となる NortthWind データベースからコピーしておきます。

「その 2 : 単体テストの実施 - コード カバレッジ」 にて使用した、 サンプル アプリケーション用ソリューション UTMyLibs を開きます。
Visual Studio 2005 を起動し、メニューより [ ファイル ] - [ 開く ] - [ プロジェクト/ソリューション ] の順に選択後、対象のソリューションファイル MyLibs.sln を開きます。

テストコードを修正し、データ駆動テストが実施できる状態にします。
[ UTMyLibs ] テストプロジェクトに [ Systsem.Data ] アセンブリの参照設定を追加し [ UnitTest1 ] クラスの宣言部に、using 句を追加します。
using System.Data;
また、[ TestGetProductName ] メソッドを以下のように変更します。
[TestMethod]
[DataSource("System.Data.SqlClient",
"Data Source=.\\sqlexpress;Initial Catalog=TESTDB;Integrated Security=True",
"TESTTBL", DataAccessMethod.Sequential)]
public void TestGetProductName()
{
int productId = (int)TestContext.DataRow["ProductID"];
string expected = (string)TestContext.DataRow["ProductName"];
string actual;
actual = MyLibs.MyComp1.GetProductName(productId);
Assert.AreEqual(expected, actual);
}
※テストメソッドの DataSource 属性は、コードでの指定だけではなく、テスト マネージャのプロパティ ウィンドウからも設定可能です。

図 2. テスト マネージャ でのDataSouce 設定

データ駆動テストを実施します。
メニューより [ テスト ] - [ ウィンドウ ] - [ テスト マネージャ ] を選択します。
テストリスト [ Test_GetProduct ] チェックボックスだけを [ ON ] にし、[ テスト マネージャ ] ウィンドウのツールバーより [ 選択されたテストを実行 ] ボタンをクリックします。
テスト結果が表示されます。

図 3. データ駆動テストの結果
テスト結果 ウィンドウのツールバーの下に、結果:成功 79/79 と表示されています。
表示されている 2 件テスト結果以外に、77 件のテスト結果が存在することが分かります。

データ駆動テストの詳細を確認します。
[ テスト結果 ] ウィンドウから、成功しているテスト [ TestGetProductName ] をダブルクリックします。

図 4. データ駆動テストの結果 - 詳細
データ ドリブン テスト結果 から、テストデータ 1 件につき 1 回のテストを実施し、それぞれのテスト結果が成功であることが分かります。
※今回のデータ駆動テストで利用したテストデータには、テスト失敗になるデータが存在しませんでした。そのため全体 77 件中、成功は 77 件、失敗が 0 件となりました。

もうひとつのメソッドをデータ駆動テストが実施できる状態にします。
TestGetProductStocks メソッドを以下のように変更します。
[TestMethod]
[DataSource("System.Data.SqlClient",
"Data Source=.\\sqlexpress;Initial Catalog=TESTDB;Integrated Security=True",
"TESTTBL", DataAccessMethod.Sequential)]
public void TestGetProductStocks()
{
int productId = (int)TestContext.DataRow["ProductID"];
int expected = (System.Int16)TestContext.DataRow["UnitsInStock"];
int actual;
actual = MyLibs.MyComp1.GetProductStocks(productId);
Assert.AreEqual(expected, actual);
}

データ駆動テストを実施します。
メニューより [ テスト ] - [ ウィンドウ ] - [ テスト マネージャ ] を選択します。
テストリスト [ Test_GetProduct ] チェックボックスだけを [ ON ] にし、[ テスト マネージャ ] ウィンドウのツールバーより [ 選択されたテストを実行 ] ボタンをクリックします。
テスト結果が表示されます。

図 5. データ駆動テストの結果
テスト結果 ウィンドウのツールバーの下に、結果:成功 148/156 と表示されています。
表示されている 2 件のテスト結果では、TestGetProductStocks がテストを失敗しています。

データ駆動テストの詳細を確認します。
[ テスト結果 ] ウィンドウから、失敗しているテスト [ TestGetProductStocks ] をダブルクリックします。

図 6. データ駆動テストの結果 - 詳細
データ ドリブン テスト結果 から、データ行 : 9 でテストが失敗しています。期待した在庫数は 0 ですが、実際は 31 が返ってきたため、テストは失敗と見なされています。
※今回のデータ駆動テストで利用したテストデータには、あえてテストが失敗するデータを 7 件設定しました。そのため全体 77 件中、成功は 70 件、失敗が 7 件となりました。
|