第 2 回境界値のテストをやってみよう
Step 1
テスト対象のプロジェクトを作成してします。
Visual Studio 2008 を起動して [ファイル] - [新規作成] - [プロジェクト] をクリックします。
図 1. [新しいプロジェクト] ダイアログからクラス ライブラリ プロジェクトを作成
[新しいプロジェクト] ダイアログが表示されるので、[テンプレート] に [クラス ライブラリ] を選択して、[プロジェクト名] に「商品価格」 と入力して、[OK] ボタンをクリックします。
Step 2
商品価格を取得するメソッドを実装していきます。プロジェクト作成時に作られている Class1 に以下のコードを追加します。
今回は購入数量に応じて、単価を変化させる「商品価格取得」メソッドを作成していきます。通常は 200 円の商品が、500 個以上の購入で 190 円、1000 個以上の購入で 180 円に値引きされます。

- public decimal 商品価格(int 数量)
{
if (数量 > 1000)
{
return 180;
}
else if (数量 > 500)
{
return 190;
}
return 200;
}
-

-
Public Function商品価格(ByVal 数量 As Integer) As Decimal
If 数量 > 1000 Then
Return 180
Else If 数量 > 500 Then
Return 190
End If
Return 200
End Function
Step 3
テスト対象メソッドの実装が終わったら、次に単体テストを実装していきましょう。
図 2. 右クリック メニューから [単体テストの作成] をクリック
テスト対象のメソッド上で右クリックして、 [単体テストの作成] をクリックします。
図 3. [単体テストの作成] でテスト作成対象のメソッドを選択
[単体テストの作成] ダイアログが表示されるので、対象のメソッドがチェックされていることを確認して、[OK] ボタンをクリックします。
図 4. テスト プロジェクトの名前を入力
[新しいテスト プロジェクト] ダイアログが表示されるので、「商品価格.Test」 と入力して、[作成] ボタンをクリックします。テスト コードは、テスト データを作成した後で変更していきます。
Step 4
Excel を使ってテスト データを作成します。
Excel で 1 行目にデータのタイトルを入力して 2 行目以降にデータを入力していきます。
図 5. Excel でテスト データを作成
CSV データには、500 個の前後である 499 〜 501 までと、
1000 個の境界である 999 〜 1001 までのデータを作成します。
図 6. テスト データを CSV 形式で保存する
ファイル名に 「商品価格テストデータ」 を入力、ファイルの種類に [CSV (カンマ区切り)] を選択して、[保存] ボタンをクリックします。
Step 5
テスト メソッドが作成できたら、CSV ファイルを選択します。
まず、メニュー バーの [テスト] - [ウィンドウ] - [テスト ビュー] をクリックして、テスト ビュー ウィンドウを表示します。
図 7. テスト ビュー ウィンドウでテスト メソッドを選択
プロジェクトで実装されているテストの一覧が表示されるので、[商品価格取得Test] を選択します。
図 8. テスト メソッドのプロパティからデータ接続文字列を選択
[プロパティ] ウィンドウにテストのプロパティが表示されるので、[データ接続文字列] を選択して、[...] ボタンをクリックします。
図 9. テスト データ ソース作成ウィザードで CSV File を選択
[テスト データ ソース作成ウィザード] で [CSV File] を選択して、[次へ] ボタンをクリックします。
図 10. CSV ファイルを選択して、プレビューを表示
CSV ファイルを選択すると CSV データがプレビュー表示されます。
[完了] ボタンをクリックして、ダイアログを閉じると、以下のダイアログが表示されます。
[はい] をクリックするとプロジェクト フォルダに CSV ファイルがコピーされます。
図 11. データベース ファイルのコピー確認ダイアログで [はい] をクリック
ダイアログが閉じると、テスト コードに以下のように CSV ファイルの情報が追加されているのが確認できます。

-
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\商品価格取得テストデータ.csv", "商品価格取得テストデータ#csv", DataAccessMethod.Sequential), DeploymentItem("ClassLibrary1.Test\\商品価格取得テストデータ.csv"), TestMethod()]

-
<DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\商品価格取得テストデータ.csv", "商品価格取得テストデータ#csv", DataAccessMethod.Sequential)> <DeploymentItem("ClassLibrary1.Test\商品価格取得テストデータ.csv")> <TestMethod()> _
さて、次にテスト コードを変更していきましょう。
Step 6
読み込んだデータでテストを実施するようにコードを変更します。

- /// <summary>
///商品価格取得 のテスト
///</summary>
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\商品価格取得テストデータ.csv", "商品価格取得テストデータ#csv", DataAccessMethod.Sequential), DeploymentItem("ClassLibrary1.Test\\商品価格取得テストデータ.csv"), TestMethod()]
public void 商品価格取得Test()
{
Class1 target = new Class1();
int quantity = (int)TestContext.DataRow["数量"];
Decimal expected = (int)TestContext.DataRow["単価"];
Decimal actual;
actual = target.商品価格(quantity);
Assert.AreEqual(expected, actual);
}
-

-
'''<summary>
'''商品価格取得 のテスト
'''</summary>
<DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\商品価格取得テストデータ.csv", "商品価格取得テストデータ#csv", DataAccessMethod.Sequential)> <DeploymentItem("ClassLibrary1.Test\商品価格取得テストデータ.csv")> <TestMethod()> _
Public Sub 商品価格取得Test()
Dim target As Class1 = New Class1
Dim quantity As Integer = CInt(TestContext.DataRow("数量"))
Dim expected As [Decimal] = CDec(TestContext.DataRow("単価"))
Dim actual As [Decimal]
actual = target.商品価格(quantity)
Assert.AreEqual(expected, actual)
End Sub
CSV ファイルから読み込んだデータを TestContext.DataRow プロパティで名前を指定して取得しているのがわかります。また、数値データは自動的に int (Integer) 型に変換されているのが確認できると思います。商品価格取得メソッドの戻り値は、Decimal 型なので、expected は、TestContext.DataRow から返される int (Integer) 値を Decimal 型に変換する必要がありますが、C# では、int 型にキャストして、自動的に Decimal に変換しています。また、VB では、CDec 関数で Decimal 型に変換されています。
Step 7
それでは、[テスト ビュー] ウィンドウのツールバーから対象のテストを選択して、テストを実行してみましょう。
図 12. ツールバーの[選択範囲の実行] をクリックしてテストを実行
テストが実行されると [テスト結果] ウィンドウにテストの実施結果が表示されます。
ここでは、テストが失敗していることがわかります。
図 13. テストの実施結果が表示される
結果の行をダブルクリックすると、テスト結果の詳細が表示されます。
図 14. テスト結果の詳細情報を確認
ここでは、6 個のテストのうち 4 個が成功して、2 個が失敗していることがわかります。また、期待していた値と実際の値の違いが表示されています。これによって境界値のコードが間違っていることがわかります。エラーになった内容を確認して、再テストを実施していきます。
以下のように比較を実施しているコードにイコールを追加して、再テストを実施してみましょう。

- public decimal 商品価格(int 数量)
{
if (数量 >= 1000)
{
return 180;
}
else if (数量 >= 500)
{
return 190;
}
return 200;
}

- Public Function商品価格(ByVal数量As Integer) As Decimal
If 数量 >= 1000 Then
Return 180
Else If 数量 >= 500 Then
Return 190
End If
Return 200
End Function
今度は正しくすべてのテストが成功していることが確認できます。
図 15. テスト結果の詳細情報を確認