チュートリアル : 単体テストの作成と実行
更新 : 2007 年 11 月
このチュートリアルでは、Team System テスト ツール を使用して一連のテストを作成、実行、およびカスタマイズする手順について説明します。開発中の C# プロジェクトで作業を開始し、そのコードを実行するテストを作成し、テストを実行し、結果を調べます。次に、プロジェクト コードを変更し、テストを再実行します。
メモ : |
---|
コマンド ラインからテストを実行する方法については、「チュートリアル : コマンド ライン テスト ユーティリティの使用」を参照してください。 |
このチュートリアルでは、次のタスクを行います。
チュートリアルで使用する "Bank Account" プロジェクトを準備します。
既存のプロジェクトを開きます。
パブリック メソッドおよびプライベート メソッドに対する単体テストを作成します。
コードでそれらのテストを実行します。
テストのエラーを見つけて、修正します。
コードのエラーを見つけて、修正します。
前提条件
- Woodgrove Bank プロジェクトユニット テストのサンプル を参照してください。
チュートリアルを準備する
チュートリアルを準備するには
Visual Studio Team System Test Edition を開きます。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] の [Visual C#] をクリックします。
[テンプレート] の [クラス ライブラリ] をクリックします。
[プロジェクト名] 行に「Bank」と入力し、[OK] をクリックします。
メモ : "Bank" という名前が既に使用されている場合は、別のプロジェクト名を選択します。
新しい Bank プロジェクトが作成され、ソリューション エクスプローラに表示されます。
ソリューション エクスプローラで Class1.cs ファイルをダブルクリックして、Visual Studio のコード エディタで開きます。
ソース コードを ユニット テストのサンプル からコピーします。
Class1.cs の元の内容を、ユニット テストのサンプル のコードで置き換えます。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
Bank という名前のプロジェクトができます。これには、テストするソース コードとテストに使用するツールが含まれています。Bank の BankAccountNS 名前空間には、パブリック クラス BankAccount が含まれます。そのメソッドを次の手順でテストします。
単体テストを作成する
必要条件 : 「チュートリアルを準備する」の手順に従います。
単体テストを作成するには
ソリューション エクスプローラで、Bank プロジェクトの Class1.cs ファイルをダブルクリックします。
これによって、ソース ファイルが開き、表示および編集できます。
Class1.cs ファイルの BankAccount クラスで、Debit() メソッドまでスクロールします。
Debit() メソッドを右クリックし、[単体テストの作成] をクリックします。
[単体テストの作成] ダイアログ ボックスが表示されます。
[現在の選択] のツリー構造に、BankAccount クラスを持つアセンブリのクラスおよびメンバの階層が表示されます。このページで、ここから任意に選択したメンバを対象に単体テストを生成し、生成された単体テストを配置するテスト プロジェクトを選択できます。
ツリー構造では、Debit() メソッドのみが選択されています。そのメソッドが選択された状態のまま、Credit() メソッドも選択します。
[出力プロジェクト] の [新しい Visual C# テスト プロジェクトを作成します] を選択します。
[設定] をクリックします。
[テスト生成の設定] ダイアログ ボックスが表示されます。[名前付け設定] では、生成時にテスト ファイル、テスト クラス、およびテスト メソッドに名前を付ける方法を変更できます。[全般] では、テスト生成の他の要素を変更できます。これらの設定を既定値のままにして、[OK] をクリックします。
[単体テストの作成] ダイアログ ボックスで、[OK] をクリックします。
[新しいテスト プロジェクト] ダイアログ ボックスが表示されます。
既定の名前を受け入れ、[作成] をクリックします。
これによって、TestProject1 という名前のプロジェクトが作成され、ソリューション エクスプローラに表示されます。
テスト クラスを含む BankAccountTest.cs という名前のファイルが TestProject1 に追加されます。クラスに TestContext プロパティおよび Debit() メソッドと Credit() メソッドをテストするためのメソッドが設定されます。
メモ : すべてのテスト メソッドに、自動的に TestMethod() 属性が割り当てられます。各テストは、テストするテスト対象コード内の 1 つのメソッドに対応します。テスト メソッドは、TestClass() 属性が割り当てられているテスト クラス内に格納されます。
BankAccountTest.cs で、テストする変数の値を指定します。DebitTest メソッドまでスクロールします。設定する変数を含む // TODO 行が表示されます。使用する値を決定する必要があります。使用する値を確認するには、アプリケーションの実行時に使用される値を知る必要があります。これらの値は、次の手順で確認できます。
Class1.cs ファイルを開き、Main メソッドまでスクロールします。customerName が Mr. Bryan Walton に初期化され、balance が 11.99 に初期化され、Credit メソッドが 5.77 のパラメータで呼び出され、Debit メソッドが 11.22 のパラメータで呼び出されていることがわかります。そのため、このアカウントが 11.99 の Balance で開始された場合、11.22 を渡して Debit メソッドを呼び出すと、新しい Balance は 0.77 になります。
メモ : この Balance の予測値 (0.77) は、「単体テストを実行およびカスタマイズする」の手順で使用します。
BankAccountTest.cs ファイルで DebitTest メソッドまでスクロールします。
次の値を設定します。
BankAccount target = new BankAccount("Mr. Bryan Walton", 11.99); double amount = 11.22;
BankAccountTest.cs ファイルの CreditTest メソッドでこれと同じ変更を行います。
BankAccountTest.cs ファイルを保存します。
Bank プロジェクトのテストを含むソース コード ファイルが作成されました。これで Bank プロジェクトのコードの BankAccountTest クラスでテストを実行する準備が整いました。
単体テストを実行およびカスタマイズする
必要条件 : 「単体テストを作成する」の手順を実行します。
単体テストを実行およびカスタマイズするには
[テスト ビュー] ウィンドウを開きます。
[DebitTest] を右クリックし、[選択範囲の実行] をクリックします。
[テスト結果] ウィンドウがまだ開いていない場合は、ここで開きます。DebitTest テストが実行されます。
テストの実行中は、[テスト結果] ウィンドウの [結果] 列にテストのステータスが [実行中] と表示されます。テストの実行が完了すると、テストの結果が [結果を作成できません] に変わります。
[テスト結果] ウィンドウで、テストを表す行をダブルクリックします。
[テスト結果の詳細] ページが開きます。このページには、テストの結果に関する情報が含まれています。
[テスト結果の詳細] ページに、エラー メッセージ "Assert.Inconclusive に失敗しました。値を返さないメソッドは確認できません。" が表示されます。テストを正しく作成するには、まず、この Assert ステートメントを見つけて評価します。
Assert ステートメントを含むテスト メソッドを見つけるには、BankAccountTest.cs ファイルを開き、DebitTest() メソッドまでスクロールします。
Assert ステートメントは DebitTest メソッドの最後の行です。次のとおりです。
Assert.Inconclusive("A method that does not return a value cannot be verified.");
この Assert ステートメントをコメント アウトします。
この時点でテストを実行すると、結果が "成功" になりますが、これはテスト対象がないためです。予測されている結果をテストするコードを追加する必要があります。DebitTest メソッドの末尾に次のステートメントを追加します。
Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05);
このステートメントは、予測されている結果 (0.77) と、BankAccount クラスの Balance メソッドを呼び出した実際の結果とを比較します。2 つの値が等しくない場合は、Assert によって False が返され、テストは失敗します。
メモ : この Assert ステートメントには、0.05 の値を持つ 3 つ目のパラメータ delta が含まれています。delta パラメータは、Assert.AreEqual メソッドのこのオーバーロードで必要であり、Doubles などの浮動小数点型に固有の丸め誤差を補正します。
BankAccountTest テスト クラスの生成された DebitTest メソッドを実行して、変更が必要であることを確認し、変更を行いました。これで、アプリケーションで Debit メソッドの精度をテストする準備ができました。
単体テストを実行してコードを修正する
必要条件 : 「単体テストを実行およびカスタマイズする」の手順を実行します。
単体テストを実行してコードを修正するには
Debit テストを再実行するには、BankAccountTest.cs の DebitTest() メソッドを右クリックし、[テストの実行] をクリックします。
テストの実行中は、[テスト結果] ウィンドウの [結果] 列にテストのステータスが [実行中] と表示されます。テストの実行が完了すると、テストの結果が "失敗しました" に変わります。
[テスト結果] ウィンドウで、テストを表す行をダブルクリックします。
[テスト結果の詳細] ページが開き、エラー メッセージ "Assert.AreEqual に失敗しました。指定する値 <0.77> と実際の値 <23.21> との間には <0.05> 以内の差が必要です。" が表示されます。これらの数値は、数値演算に問題があることを示していると考えられます。BankAccountTest クラスの DebitTest メソッドは BankAccount クラスの Debit メソッドをテストするため、最初に Debit メソッドをチェックします。
Class1.cs ファイルを開き、Debit メソッドまでスクロールします。
次のように代入されています。
m_balance += amount;
この代入では、Debit メソッドで減算するべきところで、balance に amount が加算されています。この行を次のように変更します。
m_balance -= amount;
Debit テストを再実行します。
[テスト結果] ウィンドウの [結果] 列で、[DebitTest] に "成功" が表示されます。
メモ : テストを実行するとプロジェクトが自動的にビルドされるため、ソース コードを変更した後でプロジェクトをビルドし直す必要はありませんでした。
実際の役に立つ単体テストを作成し、それを使用してコードのエラーを見つけて、修正しました。
プライベート メソッドに対する単体テストを作成して実行する
必要条件 : 「単体テストを実行してコードを修正する」の手順を実行します。
プライベート メソッドに対する単体テストを作成して実行するには
Bank プロジェクトの Class1.cs ファイルを開きます。
FreezeAccount() メソッドを右クリックし、[単体テストの作成] をクリックします。
これによって、[単体テストの作成] ダイアログ ボックスが表示されます。
表示されるツリー構造では、FreezeAccount() メソッドのみが選択されています。
(省略可能) [フィルタ] をクリックし、[パブリックでないアイテムの表示] の選択を解除します。FreezeAccount() メソッドが BankAccount クラスの子メソッドの一覧から削除されることを確認します。[フィルタ] を再度クリックし、[パブリックでないアイテムの表示] を選択して FreezeAccount() メソッドを再表示します。
FreezeAccount() メソッドが選択されていることを確認し、[OK] をクリックします。
Bank.accessor という名前のプライベート アクセサ ファイルが作成されます。このファイルには、テストにおいて BankAccount クラス内のプライベート メソッドの間接的な呼び出しに使用される特別なアクセサ メソッドが含まれています。新しいファイルは、ソリューション エクスプローラの [テストの参照] フォルダに表示されます。
BankAccountTest.cs ファイルを開き、FreezeAccountTest() メソッドまでスクロールします。
FreezeAccountTest() メソッドのコードを次のように変更します。変更した部分または新規に作成した部分を示します。
public void FreezeAccountTest() { BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value target.FreezeAccount(); // Assert.Inconclusive("A method that does not return a value cannot be verified."); bool creditAccount = false; // False means account could be credited: Fail test. // Try to credit account try { target.Credit(1.00); } catch (System.Exception) { // Threw exception. FreezeAccount worked correctly: Pass test. creditAccount = true; } // Assert fails if 'creditAccount' condition is false. Fail test. Assert.IsTrue(creditAccount, "Was able to credit account."); }
FreezeAccountTest テストを実行します。
[テスト結果] ウィンドウの [結果] 列に、最終的なテストのステータスが [成功] と表示されます。これは予想どおりの結果です。FreezeAccount() メソッドの呼び出しによってアカウントが凍結された後で Credit() メソッドが呼び出されたからです。
プライベート メソッドを追加し、それに対する新しい単体テストを作成し、テストを実行しました。引き続き、balance 変数に 15.00 などの他の境界値を使用して実行できます。
次の手順
テストをアセンブリに含まれているコードで実行する場合は、コード カバレッジ データを収集することで、テスト中のプロジェクト コードの割合を確認できます。詳細については、「チュートリアル : テストを実行し、コード カバレッジを表示する」を参照してください。
テストは、Visual Studio のほかにコマンド ラインでも実行できます。詳細については、「チュートリアル : コマンド ライン テスト ユーティリティの使用」を参照してください。