単体テストの基本
このトピックでは、Visual Studio Test エクスプローラーで記述と単体テストの概要について説明します。このチュートリアルは、次のセクションで構成されています。
Unit testing overview
- Quick starts
The MyBank Solution example
Creating the unit test projects
Writing your tests
Running tests in Test Explorer
Running and viewing tests from the Test Explorer toolbar
Running tests after every build
Filtering and grouping the test list
Debugging unit tests
Additional tools for unit tests
Generating application code from tests
Generating multiple tests by using data driven test methods
Analyzing unit test code coverage
Isolating unit test methods with Microsoft Fakes
単体テストの概要
Visual Studio Test エクスプローラーは、ソフトウェアの開発手法の単体 テストを 組み込むチームおよび開発者をサポートするように設計されています。単体テストが期待どおりにアプリケーション コードがするとすることで、プログラムの正確な動作を確認できます。単体テストでは、個々の 単位としてテストできる独立した検証可能な動作を検出するプログラムの機能を分析します。これらの動作のテストを作成し、それらのテストの結果を報告するために 単体テスト フレームワークを 使用します。
単位のテストは、ソフトウェア開発のワークフローの重要な部分との大きな影響を及ぼします。アプリケーション コード内の関数または他のブロックを記述したら、コードの動作を検証する、入力データの標準、境界、不正なケースに対応するコードによる明示的または暗黙的な前提を確認して単体テストを作成します。テスト駆動開発と呼ばれるソフトウェア開発手法では、コードを記述するため、を使用して単体テストを作成する前に、機能のデザインとドキュメントや機能仕様として単体テスト。
テストのエクスプローラーは、単体テストを実行し、Visual Studio の結果を表示するための柔軟で効率的な方法を提供します。Visual Studio は、マネージ コードとネイティブ コードの Microsoft 単体テスト フレームワークをインストールします。テストのエクスプローラーは、テストのエクスプローラーのアドオンのインターフェイスを実装するサードパーティとオープン ソースの単体テスト フレームワークを実行できます。Visual Studio の拡張機能マネージャーおよび Visual Studio ギャラリーを使用してこれらのフレームワークの多くを追加できます。「方法: サードパーティ製の単体テスト フレームワークをインストールする」を参照してください。
テストのエクスプローラー ビューは、テストをすべて表示するか、合格したテストに失敗したがまだ実行されていません、またはとばされませんいません。グローバル レベルでまたは定義済みのフィルターの 1 種類を選択すると、ビューのテストを特定のテキスト ボックスに一致するフィルター処理できます。テストをいつでも実行できます。Visual Studio Ultimateを使用すると、ビルドの後にテストを自動的に実行できます。テスト実行の結果は、エクスプローラー ウィンドウの上部にパスまたは失敗のバーで明確です。テスト メソッドの結果の詳細には、テストを選択したときに表示されます。
クイック スタート
コーディングに直接格納する単体テストの概要については、これらのトピックの 1 を参照:
MyBank のソリューションの例
このトピックでは、例として MyBank という架空のアプリケーション開発を使用します。実際のコードがこのトピックの説明に従ってする必要はありません。テスト メソッドは、C# で記述され、マネージ コード用の Microsoft 単体テスト フレームワークを使用して、次の概念は、他の言語およびフレームワークに簡単に移動します。
MyBank のアプリケーションの設計の最初の試行は銀行と別のアカウント、およびトランザクションを表す、および個別のアカウントを集計して管理する機能を表すデータベースのコンポーネントが含まれますアカウントのコンポーネントが。
ここでは、2 種類のプロジェクトを含む MyBank のソリューションを作成します:
Accounts
BankDb
Accounts のプロジェクトのデザインの最初の試行はアカウント、口座の資産を沈殿し、バックトラッキングするのようなアカウントに任意の型の共通機能を指定すると、チェックのアカウントを表すインターフェイスから派生するクラスが含まれますインターフェイスに関する基本情報を保持するクラスを示しています。" " のソース ファイルを作成してアカウントのプロジェクトを開始します:
AccountInfo.cs はアカウントの基本情報を定義します。
IAccount.cs は沈殿し、口座の資産をバックトラッキングし、残りの値を取得するメソッドなどのアカウントの IAccountの標準インターフェイスを定義します。
CheckingAccount.cs はチェックのアカウントの IAccounts のインターフェイスを実装する CheckingAccount のクラスが含まれています。
これは環境からチェック アウトの口座のコールバック必要がある 1 点がバックトラッキング、残高照会された量未満であることを確認することがわかります。したがって、この条件をチェックするメソッドの CheckingAccount の IAccount.Withdaw のメソッドをオーバーライドします。メソッドは、次のような可能性があります:
public void Withdraw(double amount)
{
if(m_balance >= amount)
{
m_balance -= amount;
}
else
{
throw new ArgumentException(amount, "Withdrawal exceeds balance!")
}
}
ここにコードがあるため、テスト時間です。
単体テスト プロジェクトの作成
単体テスト プロジェクトは通常、単一のコード プロジェクトの構造を反映します。MyBank の例では、MyBanks のソリューションに AccountsTests と BankDbTests という、二つの単体テスト プロジェクトを追加します。テスト プロジェクトの名前は任意ですが、標準の名前付け規則を使用することをお勧めします。
単体テストを追加するには、ソリューションに投影します:
[ファイル] で、メニューの 新規 を選択し、キーボードを [プロジェクト] (Ctrl + Shift + N) を選択します。
新しいプロジェクト] ダイアログ ボックスで、[インストール済み] のノードをクリックし、テスト プロジェクトに使用するを選択します **[テスト]**を言語を展開します。
Microsoft の単体テスト フレームワークの 1 つを使用するには、プロジェクト テンプレートの一覧 [単体テスト プロジェクト] を選択します。それ以外の場合は、使用する単体テスト フレームワークのプロジェクト テンプレートを選択します。この例の Accounts プロジェクトをテストするには、プロジェクト AccountsTestsを示します。
注意 すべてのサードパーティとオープン ソースの単体テスト フレームワークが Visual Studio のプロジェクト テンプレートはありません。プロジェクトの作成に関する情報のフレームワークのドキュメントを参照してください。
単体テスト プロジェクトで、アカウントへのこの例のテスト対象コード プロジェクトへの参照をプロジェクトおよびプロジェクトに追加します。
コードへの参照を作成するには、:
ソリューション エクスプローラーでプロジェクトを選択します。
[プロジェクト] で、メニューの **[参照の追加]**を選択します。
参照マネージャー] ダイアログ ボックスで、[ソリューション] のノードを開き、プロジェクトを選択します。コード プロジェクトの名前を選択し、ダイアログ ボックスを閉じます。
各単体テスト プロジェクトは、コード プロジェクトのクラス名を反映したクラスが含まれています。この例では、AccountsTests のプロジェクトでは、次のクラスが含まれています:
AccountInfoTests のクラスは BankAccount のプロジェクトで AccountInfo のクラスの単体テスト メソッドが格納されます
CheckingAccountTests のクラスは CheckingAccount のクラスの単体テスト メソッドが含まれます。
テストを記述できます。
使用すると Visual Studio の IntelliSense は、コード プロジェクトの単体テストを作成していきます単体テスト フレームワーク。テストのエクスプローラーで実行するには、ほとんどのフレームワークは単体テスト メソッドを識別する特定の属性を追加する必要があります。フレームワークは、assert ステートメントによって通常の方法を提供します。または、テスト メソッドが成功したか失敗したかをメソッドは属性に示します。他の属性はクラスの初期化になる前に各テスト メソッドを呼び出し、各テスト メソッドの後に実行、および以前に破棄されるするクラスのメソッドが省略可能なセットアップ メソッドを識別します。
(AAA の Assert 配置して機能します) パターン、テスト中にメソッドの単体テストの作成は共通部分です。
単体テスト メソッドの [並べ替え] のセクションでは、オブジェクトを初期化し、テスト対象のメソッドに渡されるデータの値を設定します。
動作 のセクションでは、配置されたパラメーターのテストされるメソッドを呼び出します。
[Assert] のセクションでは、テストされるメソッドの動作が正常に動作することを確認します。
この例の CheckingAccount.Withdraw のメソッドをテストするために、2 個のテストを記述できます: メソッドの標準動作を検証する 1、およびことを確認する残高詳細にコールバック 1 は失敗します。CheckingAccountTests のクラスでは、次のメソッドを追加します:
[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
// arrange
double currentBalance = 10.0;
double withdrawal = 1.0;
double expected = 9.0;
var account = new CheckingAccount("JohnDoe", currentBalance);
// act
account.Withdraw(withdrawal);
double actual = account.Balance;
// assert
Assert.AreEqual(expected, actual);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void Withdraw_AmountMoreThanBalance_Throws()
{
// arrange
var account = new CheckingAccount("John Doe", 10.0);
// act
account.Withdraw(1.0);
// assert is handled by the ExcpectedException
}
テスト メソッドの成功を決定するために Withdraw_AmountMoreThanBalance_Throws は ExpectedException の属性を使用するメソッドをテストが成功したか失敗したかを決定するために Withdraw_ValidAmount_ChangesBalance が Assert の明示的なステートメントを使用することに注意してください。カバーで、try ブロックと catch ステートメントの単体テスト フレームワークのラップのテスト メソッド。ほとんどの場合、例外がキャッチされた場合は、テスト メソッドは失敗し、例外は無視されます。特定の例外がスローされた場合 ExpectedException の属性により、テスト メソッドは成功します。
Microsoft 単体テスト フレームワークに関する詳細については、次のトピックから 1 を参照:
テストのエクスプローラーで実行中のテスト
テスト プロジェクトをビルドすると、テストはテストのエクスプローラーに表示されます。テストのエクスプローラーが表示されない場合は、Visual Studio のメニューの [テスト] を選択し、Windowsを選択し、を **[テスト エクスプローラー]**を選択します。
実行するように作成し、テストのエクスプローラーのテスト、既定のビュー [失敗したテスト]のグループの結果、[成功したテスト]、テスト状態 と **[テストを実行しない]**を再実行します。すべてのテストを、そのグループに表示できるビューを開くにグループの見出しを選択できます。
テストをテストのエクスプローラーのツール バーに移動し、表示します
テストのエクスプローラーのツール バーはことで、検出するのに役立ちます編成し、テストを実行します。
テストをすべて実行するに [すべて実行] を選択することも、テストのサブセットを実行することを選択するため [実行] を選択します。一連のテストを実行すると、テストの実行の概要はテストのエクスプローラー ウィンドウの下部に表示されます。下部のペインにそのテストの詳細を表示するには、テストを選択します。コンテキスト メニュー (キーボードから [テストを開く] を選択する: 選択したテストのソース・コードを表示する F12)。
すべてのビルドの後のテストの実行
注意 |
---|
すべてのビルドの後の単体テストは、Visual Studio Ultimate でのみサポートされます。 |
各ローカル ビルドが、標準のメニューの [テスト] を選択した後、単体テストを実行するには、テストのエクスプローラーのツール バーの [ビルド後にテストを実行] を選択します。 |
テスト リストをフィルター処理、グループ化します
複数のテストがある場合、指定した文字列に、一覧をフィルター処理するテストのエクスプローラーの検索ボックスを入力できます。フィルターの一覧から選択することで、フィルター イベントをさらに制限できます。
カテゴリ別にテストをグループ化するには、[グループ化] のボタンをクリックします。 |
詳細については、「テスト エクスプローラーを使用した単体テストの実行」を参照してください。
単体テストのデバッグ
テストのデバッグ セッションを開始するには、テストのエクスプローラーを使用できます。シームレスな Visual Studio のデバッガーを使用してコードのステップ実行はテスト対象の単体テストとプロジェクトの間の前後になります。デバッグを開始するには:
Visual Studio エディターで、デバッグする一つ以上のテスト メソッドにブレークポイントを設定します。
[!メモ]
テスト メソッドが任意の順序で実行できるため、デバッグするすべてのテスト メソッドにブレークポイントを設定します。
テストのエクスプローラーで、テスト メソッドを選択し、ショートカット メニューの [選択したテストのデバッグ] を選択します。
デバッガーに関する詳細については、Visual Studio でのデバッグを参照してください。
単体テストのツール
テストからアプリケーション コードの生成
プロジェクトのコードを記述する前にテストを作成する場合は、プロジェクトのコードのクラスおよびメソッドの生成に IntelliSense を使用できます。使用すると、生成するメソッドまたはクラスを呼び出し、その呼び出しの下に IntelliSense メニューを開くテスト メソッドでステートメントを記述します。呼び出しが新しいクラスのコンストラクターにある場合は、[新しい型の生成] メニューのを選択し、コード プロジェクトのクラスを挿入するために、ウィザードに従います。呼び出しがメソッドにある場合は、IntelliSense メニューから 新しいメソッドを生成します。*** を選択します。
複数のテストをデータ ドリブン テスト メソッドを使用して生成されます。
[!メモ]
これらの手順は、マネージ コードについては、Microsoft の単体テスト フレームワークを使用して記述テスト メソッドにのみ適用されます。別のフレームワークを使用する場合は、同等の機能フレームワークに関するドキュメントを参照してください。
データ ドリブン テスト メソッドは 一つの単体テスト メソッドの値の範囲を確認することができます。データ ドリブン単体テスト メソッドを作成するには、テストする変数の値を含むデータ ソースとテーブルを指定する DataSource のメソッドを属性で装飾します。メソッドの本体で、TestContext.DataRow[ColumnName] のインデクサーを使用して変数に行の値を割り当てます。
たとえば、が AddIntegerHelperという名前の CheckingAccount のクラスに不要なメソッドを追加するとします。AddIntegerHelper は 2 個の整数を追加します。
AddIntegerHelper のメソッドのデータ ドリブン テストを作成するために、最初に AccountsTest.accdb と AddIntegerHelperDataという名前のテーブルという名前の Access データベースを作成します。AddIntegerHelperData の表は、予期される結果を指定するために追加の列と 1 番 2 番目のオペランドを指定するように列を定義します。ここでは、の値を適切に多数の行を塗りつぶします。
[DataSource(
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Projects\MyBank\TestData\AccountsTest.accdb",
"AddIntegerHelperData"
)]
[TestMethod()]
public void AddIntegerHelper_DataDrivenValues_AllShouldPass()
{
var target = new CheckingAccount();
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
int actual = target.AddIntegerHelper(x, y);
Assert.AreEqual(expected, actual);
}
属性付きメソッドは、テーブル内の各行に対して一度ずつ実行されます。イテレーションのいずれかが失敗するメソッドに対してエクスプローラーのレポートは、テストの失敗をテストします。メソッドのテスト結果の詳細ペインでは、データの行ごとにパスとエラー条件のメソッドを示します。
詳細については、「方法: データ ドリブン単体テストを作成する」を参照してください。
単体テストのコード カバレッジ分析
[!メモ]
単体テストのコード カバレッジは単体テスト フレームワークによって移動できるネイティブに使用できるとマネージ言語とすべての単体テスト フレームワークです。
Visual Studio のコード カバレッジのツールを使用して、単体テストで実際にテスト中の製品コードの量を決定できます。選択したテストまたはソリューションのすべてのテストのコード カバレッジを実行できます。コード カバレッジは、ウィンドウの行で実行する場合、名前空間、モジュール、関数、クラスと製品コード ブロックの割合です。
ソリューションのテスト メソッドのコード カバレッジを実行するには、
Visual Studio のメニューの [テスト] を選択し、**[コード カバレッジの分析]**を選択します。
これらのコマンドの 1 種類を選択する:
[選択されたテスト] は、テストのエクスプローラーで選択したテスト メソッドを実行します。
すべてのテスト は、ソリューションのすべてのテスト メソッドを実行します。
カバレッジの結果は、[コード カバレッジの結果] ウィンドウに表示されます。
詳細については、「コード カバレッジを使用した、テストされるプロジェクトのコード割合の確認」を参照してください。
Microsoft の偽造項目の単体テスト メソッドの分離
[!メモ]
Microsoft の偽造項目は、Visual Studio Ultimate でのみ使用できます。Microsoft の偽造項目は、マネージ コードの単体テスト フレームワークを使用して記述テスト メソッドでのみ使用できます。
問題
関数の内部コードの確認に焦点を当てた外部依存関係を導入テストのコール関数の下のを書き込むメソッドが難しい場合があります。たとえば、CheckingAccount の例のクラスのメソッドは BankDb のコンポーネントと考えられる主要なデータベースを更新する呼び出しを行う必要があります。これは次のように見えてもリファクタリング CheckingAccount のクラスがあります:
class CheckingAccount : IAccount
{
public CheckingAccount(customerName, double startingBalance, IBankDb bankDb)
{
m_bankDb = bankDb;
// set up account
}
public void Withdraw(double amount)
{
if(m_balance >= amount)
{
m_balance = m_MyBankDb.Withdraw(m_accountInfo.ID, amount);
}
else
{
throw new ArgumentException(amount, "Withdrawal exceeds balance!")
}
}
private IBankDb m_bankDb = null;
// ...
CheckingAccount.Withdraw でこのメソッドの単体テストは呼び出しによる m_bankDb.Withdrawへの問題で失敗する場合があります。データベースまたはネットワーク接続が失われることも、データベースのアクセス許可が間違う場合があります。m_bankDB.Withdraw の呼び出しエラーによってテストが内部コードに関連しない理由で失敗しました。
Microsoft は、ソリューション) を使用します。
Microsoft の偽造項目は、依存関係を引き起こす単体テスト メソッドのクラスと置き換えることができるクラスとメソッドを含むアセンブリを作成します。生成された項目のモジュール) の代わりにクラスは、対象コンポーネントの各パブリック メソッドのイベントとデリゲートを宣言します。テスト メソッドで、テストするメソッドの依存関係の呼び出しの正確な動作を作成するためのデリゲートを実装します。
この例では、BankDb のプロジェクトの偽造項目のアセンブリを作成したり、次に生成される相互作用によるデータベースと不確実性を削除する項目) によって IBankDb のインターフェイスから派生し、StubIBankDb クラスを使用します。Withdraw_ValidAmount_ChangesBalance のテスト メソッドの modifed バージョンは次のようになっています:
[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
// arrange
double currentBalance = 10.0;
double withdrawal = 1.0;
double expected = 9.0;
// set up the Fakes object and delegate
var stubBankDb = new MyBank.Stubs.StubIBankDb();
stubBankDb.WithdrawDoubleDouble = (id, amount) => { return 9.0; }
var account = new CheckingAccount("JohnDoe", currentBalance, stubBankDb);
// act
account.Withdraw(withdrawal);
double actual = account.Balance;
// assert
Assert.AreEqual(expected, actual);
}
テスト メソッドのこの行:
stubBankDb.WithdrawDoubleDouble = (id, amount) => { return 9.0; }
lamba の式を使用して Withdraw のメソッドの偽造項目のデリゲートを実装します。stubBankDb.Withdraw のメソッドは、デリゲートを常に呼び出し、その確実に Accounts のメソッドの動作を検証するためのテスト メソッドを使用して、特定量を返します。
Microsoft の偽造項目に関する詳細
Microsoft には、別のクラスを作成する 2 とおりの方法を使用します) :
スタブが ターゲットの依存関係のクラスの親のインターフェイスから派生する別のクラスを生成します。スタブ メソッドは、ターゲットのパブリック クラスの仮想メソッドの代わりに使用できます。
非仮想メソッドの代わりに shim のメソッドにターゲット メソッドの呼び出しを切り替えるShim の 使用時のインストルメンテーション。
両方の方法では、依存関係のメソッドには、テスト メソッドで目的の動作を指定するには、呼び出しの生成されたデリゲートを使用します。
詳細については、「Microsoft Fakes を使用したテストでのコードの分離」を参照してください。