ステップ 7 ハンズオン 「Visual Studio 2005 Team System によるアプリケーション品質の向上」
第 3 回 品質の高いコード作成 (2) - その 1
単体テストの実施
NRI ラーニングネットワーク
荒木 達也
最終更新日 2007 年 10 月 17 日
| 目標 | Visual Studio Team System による単体テストの実施 |
|---|
| 使用技術 | - Visual Studio Team System / C#
- .NET Framework 2.0
|
|---|
| 取り上げるトピックス | |
|---|
| 前提知識 | |
|---|
| 関連記事 | |
|---|
単体テスト
今回は、「 品質の高いコード作成 (1) - その 1 : 静的コード分析の設定と実施」 で作成した ”GetProductName” と、Step2 で追加する ”GetProductStocks” の 2 つのメソッドについて単体テストを実施します。
.gif)
図 1. 単体テストを実施するコンポーネント
実装する処理 | メソッド | 呼び出し対象 |
|---|
| 商品在庫数取得 | GetProductStocks | UnitTest1.TestGetProductStocks |
| 商品名取得処理の単体テスト | TestGetProductName | MyComp1.GetProductName |
| 商品在庫数取得処理の単体テスト | TestGetProductStocks | MyComp1.GetProductStocks |
.gif)
「 品質の高いコード作成 (1) - その 1 : 静的コード分析の設定と実施」 にて作成した、サンプル アプリケーション用ソリューション ”MyLibs.sln” を開きます。
Visual Studio 2005 を起動し、メニューより [ ファイル ] - [ 開く ] - [ プロジェクト/ソリューション ] の順に選択後、対象のソリューションファイル ”MyLibs.sln” を開きます。
.gif)
”MyComp1” クラスに、商品の在庫数を取得する ”GetProductStocks” メソッドを追加します。
public static int GetProductStocks(int productId)
{
int result;
SqlConnection cn = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = "SELECT UnitsInStock FROM Products" +
" WHERE ProductID = @ProductID";
SqlParameter parmProdID = cmd.Parameters.Add
("@ProductID", SqlDbType.Int);
parmProdID.Value = productId;
try
{
cn.Open();
result = (Int16)cmd.ExecuteScalar();
}
catch
{
result = int.MaxValue;
}
finally
{
cn.Close();
cmd.Dispose();
cn.Dispose();
}
return (result);
}
.gif)
ソリューションに、テストプロジェクト ”UTMyLibs” を追加します。
Visual Studio 2005 を起動し、メニューより [ ファイル ] - [ 追加 ] - [ 新しいプロジェクト ] の順に選択し、プロジェクトを追加します。
プロジェクトの種類 | テンプレート | プロジェクト名 |
|---|
| C# - テスト | テスト プロジェクト | UTMyLibs |
.gif)
図 2. 追加するテスト プロジェクト
なおプロジェクト追加後、今回の単体テストで使用しないファイルは、”UTMyLibs” プロジェクトから削除しておきます。 (AuthoringTests.txt、ManualTest1.mht など)
.gif)
”UTMyLibs” プロジェクトにて、同一ソリューション内の ”MyLibs” プロジェクトに参照設定をした後、”UnitTest1” クラスを以下のようなテストコードに変更します。
public class UnitTest1
{
public UnitTest1()
{
//
// TODO: コンストラクタ ロジックをここに追加してください
//
}
追加テスト属性
[TestMethod]
public void TestGetProductName()
{
int productId = 1;
string expected = "Chai";
string actual;
actual = MyLibs.MyComp1.GetProductName(productId);
Assert.AreEqual(expected, actual);
}
[TestMethod]
public void TestGetProductStocks()
{
int productId = 1;
int expected = 39;
int actual;
actual = MyLibs.MyComp1.GetProductStocks(productId);
Assert.AreEqual(expected, actual);
}
}
.gif)
作成したテストプロジェクトを実行し、単体テストを実施します。
ソリューションエクスプローラにて [ UTMyLibs ] プロジェクトを右クリックし、ポップアップメニューより [スタートアップ プロジェクトに設定] を選択します。
メニューより [ デバッグ ] - [ デバッグの開始 ] を選択します。
テストコードが実行され、しばらくするとテスト結果が表示されます。
.gif)
図 3. テスト結果
2 つのメソッドの単体テストが正常に完了したことが報告されます。
.gif)
テストの失敗ケースを確認します。
以下のように ”TestGetProductName” メソッドを修正します。
※商品 ID: 1 は、”Chaix” という商品名ではないため、テストは失敗するはずです。
[TestMethod]
public void TestGetProductName()
{
int productId = 1;
string expected = "Chaix";
string actual;
actual = MyLibs.MyComp1.GetProductName(productId);
Assert.AreEqual(expected, actual);
}
コード修正後、Step5 と同様の手順で単体テストを実施します。
.gif)
図 4. テスト結果
”TestGetProductName” メソッドの単体テストが失敗したことが報告されます。
※このステップで変更したテストデータ ”Chaix” は、元の正常なテストデータ ”Chai” に戻しておきます。
.gif)
テストコードを管理する テスト マネージャ を操作します。
メニューより [ テスト ] - [ ウィンドウ ] - [ テスト マネージャ ] を選択します。
.gif)
図 5. テスト マネージャ
このテストマネージャを使用することにより、テストコードのグループ化 (テストリスト) が可能となり、より一層テスト作業が効率化されます。
テストリストを作成するには、 [ テスト マネージャ ] ウィンドウにて [ テストの一覧 ] をクリックします。
画面中央のメッセージから [ ここを ] と表示されているリンクをクリックし、[ 新しいテスト リストの作成 ] ダイアログボックス開きます。
テストリストの名前、説明を指定し [ OK ] ボタンをクリックします。
作成されたテストリストに、表示されている既存のテストメソッドを [ ドラッグ & ドロップ ] することにより、テストコードがグループ化されます。
※テストリストを作成することにより、ビルドタイプを定義する際に参照することができ、日次ビルド、常時ビルドなどのシナリオで利用可能となります。
.gif)
図 6. テスト マネージャ ? テストリスト によるテスト実施
ページのトップへ