チュートリアル: 使用法から生成機能のテスト ファーストのサポート
このトピックでは、テスト ファースト開発をサポートする使用法から生成機能の使用方法を示します。
テスト ファースト開発は、最初に製品仕様に基づいて単体テストを記述してから、テストを成功させるために必要なソース コードを記述するソフトウェア設計のアプローチです。Visual Studio では、新しい型とメンバーを定義する前に、テスト ケースで最初に参照するときにそれらをソース コードに生成することで、テスト ファースト開発をサポートします。
Visual Studio では、ワークフローの中断を最小限にして新しい型とメンバーが生成されます。現在のコード位置から離れずに、型、メソッド、プロパティ、フィールド、またはコンストラクターのスタブを作成できます。ダイアログ ボックスを開いて型生成のオプションを指定すると、ダイアログ ボックスを閉じたときに、現在開いているファイルにフォーカスがすぐに戻ります。
使用法から生成機能は、Visual Studio と統合されるテスト フレームワークで使用できます。このトピックでは、Microsoft 単体テスト フレームワークについて説明します。
[!メモ]
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。
Windows クラス ライブラリ プロジェクトとテスト プロジェクトを作成するには
Visual C# または Visual Basic で、新しい Windows クラス ライブラリ プロジェクトを作成します。使用している言語に応じて、プロジェクトに GFUDemo_VB または GFUDemo_CS という名前を付けます。
ソリューション エクスプローラーの上部にあるソリューション アイコンを右クリックし、[追加] をポイントして [新しいプロジェクト] をクリックします。[新しいプロジェクト] ダイアログ ボックスの左側にある [プロジェクトの種類] ペインで、[テスト] をクリックします。
テンプレート ウィンドウ、クリックして 単体テスト プロジェクトと UnitTestProject1 のデフォルト名をそのまま使用します。次の図は、Visual C# に表示されるダイアログ ボックスを示しています。Visual Basic でも、ダイアログ ボックスは同様の外観になります。
[新しいプロジェクト] ダイアログ ボックス
[OK] をクリックして、[新しいプロジェクト] ダイアログ ボックスを閉じます。これで、テストの記述を開始できるようになりました。
単体テストから新しいクラスを生成するには
テスト プロジェクトには、UnitTest1 という名前のファイルが含まれています。ソリューション エクスプローラーで、このファイルをダブルクリックしてコード エディターで開きます。テスト クラスとテスト メソッドが生成されています。
UnitTest1 クラスの宣言を検索し、名前を AutomobileTest に変更します。C# では、UnitTest1() コンストラクターが存在する場合は名前を AutomobileTest() に変更します。
[!メモ]
現在、IntelliSense のステートメント入力候補には、入力候補モードと候補提示モードの 2 種類があります。まだ定義していないクラスやメンバーを使用する場合は、候補提示モードを使用します。IntelliSense ウィンドウが開いているときに Ctrl + Alt + Space キーを押すと、IntelliSense の入力候補モードと候補提示モードを切り替えることができます。詳細については、「IntelliSense の使用方法」を参照してください。候補提示モードは、次の手順で「Automobile」と入力する場合に役立ちます。
TestMethod1() メソッドを検索し、名前を DefaultAutomobileIsInitializedCorrectly() に変更します。次の図に示すように、このメソッドの内部に、Automobile というクラスの新しいインスタンスを作成します。コンパイル時のエラーを示す波線が表示され、型名の下にスマート タグが表示されます。スマート タグの厳密な場所は、Visual Basic と Visual C# のどちらを使用しているかによって異なります。
Visual Basic
Visual C#
スマート タグの上にマウス ポインターを置くと、Automobile という名前の型がまだ定義されていないことを示すエラー メッセージが表示されます。スマート タグをクリックするか、Ctrl キーを押しながら .(Ctrl + ピリオド) キーを押して、次の図に示す [使用法から生成] ショートカット メニューを開きます。
Visual Basic
Visual C#
ここで、2 つの選択肢があります。['Automobile クラス' を生成] をクリックすると、テスト プロジェクトに新しいファイルを作成し、Automobile という空のクラスを設定できます。この方法では、現在のプロジェクトの新しいファイル内に既定のアクセス修飾子を持つ新しいクラスをすばやく作成できます。[新しい型の生成] をクリックして、[新しい型の生成] ダイアログ ボックスを開くこともできます。これには、既存のファイルへのクラスの挿入や別のプロジェクトへのファイルの追加などのオプションがあります。
[新しい型の生成] をクリックして、次の図に示す [新しい型の生成] ダイアログ ボックスを開きます。[プロジェクト] の一覧で、[GFUDemo_VB] または [GFUDemo_CS] をクリックして、テスト プロジェクトではなくソース コード プロジェクトにファイルを追加するように Visual Studio に指示します。
[新しい型の生成] ダイアログ ボックス
[OK] をクリックしてダイアログ ボックスを閉じ、新しいファイルを作成します。
ソリューション エクスプローラーで、GFUDemo_VB または GFUDemo_CS プロジェクト ノードの下を参照し、新しい Automobile.vb ファイルまたは Automobile.cs ファイルがあることを確認します。コード エディターでは、フォーカスがまだ AutomobileTest.DefaultAutomobileIsInitializedCorrectly にあります。最小限の中断で、テストの記述を続行できます。
プロパティ スタブを生成するには
Automobile クラスに、Model および TopSpeed という名前の 2 つのパブリック プロパティがあることを示す製品仕様があるとします。これらのプロパティは、既定のコンストラクターによって "Not specified" および -1 の既定値で初期化されている必要があります。次の単体テストでは、既定のコンストラクターがプロパティを適切な既定値に設定することを検証します。
DefaultAutomobileIsInitializedCorrectly に次のコード行を追加します。
Assert.IsTrue((myAuto.Model = "Not specified") And (myAuto.TopSpeed = -1))
Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
コードは Automobile の 2 つの未定義プロパティを参照するので、スマート タグが表示されます。Model のスマート タグをクリックし、[プロパティ スタブの生成] をクリックします。TopSpeed プロパティのプロパティ スタブも生成します。
Automobile クラスでは、新しいプロパティの型がコンテキストから正しく推論されます。
スマート タグのショートカット メニューを次の図に示します。
Visual Basic
Visual C#
ソース コードを検索するには
新しいプロパティが生成されていることを確認するために、[移動] 機能を使用して、Automobile.cs または Automobile.vb のソース コード ファイルに移動します。
[移動] 機能を使用すると、型名や名前の一部などのテキスト文字列をすばやく入力し、結果の一覧の要素をクリックして目的の場所に移動できます。
[移動] ダイアログ ボックスを開くには、コード エディター内をクリックし、Ctrl キーを押しながら , (Ctrl + コンマ) キーを押します。テキスト ボックスに「automobile」と入力します。一覧で [Automobile] クラスを選択し、[OK] をクリックします。
次の図に [移動] ウィンドウを示します。
[移動] ウィンドウ
新しいコンストラクターのスタブを生成するには
このテスト メソッドでは、指定した値を持つように Model プロパティおよび TopSpeed プロパティを初期化するコンストラクター スタブが生成されます。後でコードを追加してテストを完成させます。次の追加テスト メソッドを AutomobileTest クラスに追加します。
<TestMethod()> Public Sub AutomobileWithModelNameCanStart() Dim model As String = "Contoso" Dim topSpeed As Integer = 199 Dim myAuto As New Automobile(model, topSpeed) End Sub
[TestMethod] public void AutomobileWithModelNameCanStart() { string model = "Contoso"; int topSpeed = 199; Automobile myAuto = new Automobile(model, topSpeed); }
新しいクラス コンストラクターの下のスマート タグをクリックし、[コンストラクター スタブの生成] をクリックします。Automobile クラス ファイルで、新しいコンストラクターが、コンストラクター呼び出しで使用されているローカル変数の名前を調べ、同じ名前のプロパティを Automobile クラスに見つけ、引数値を Model プロパティおよび TopSpeed プロパティに格納するためのコードをコンストラクター本体に指定したことがわかります (Visual Basic では、新しいコンストラクターの _model フィールドおよび _topSpeed フィールドは、Model プロパティおよび TopSpeed プロパティの暗黙に定義されたバッキング フィールドです)。
新しいコンストラクターを生成した後で、DefaultAutomobileIsInitializedCorrectly の既定のコンストラクターへの呼び出しの下に波線が表示されます。エラー メッセージには、Automobile クラスに 0 個の引数を受け取るコンストラクターがないことが示されます。パラメーターを持たない明示的な既定のコンストラクターを生成するには、スマート タグをクリックし、[コンストラクター スタブの生成] をクリックします。
メソッドのスタブを生成するには
仕様で、Model プロパティおよび TopSpeed プロパティが既定値以外の値に設定されている場合に新しい Automobile を実行状態にできることが規定されているとします。AutomobileWithModelNameCanStart メソッドに次の行を追加します。
myAuto.Start() Assert.IsTrue(myAuto.IsRunning = True)
myAuto.Start(); Assert.IsTrue(myAuto.IsRunning == true);
myAuto.Start メソッド呼び出しのスマート タグをクリックし、[メソッド スタブの生成] をクリックします。
IsRunning プロパティのスマート タグをクリックし、[プロパティ スタブの生成] をクリックします。Automobile クラスには次のコードが含まれています。
Public Class Automobile Sub New(ByVal model As String, ByVal topSpeed As Integer) _model = model _topSpeed = topSpeed End Sub Sub New() ' TODO: Complete member initialization End Sub Property Model() As String Property TopSpeed As Integer Property IsRunning As Boolean Sub Start() Throw New NotImplementedException End Sub End Class
public class Automobile { public string Model { get; set; } public int TopSpeed { get; set; } public Automobile(string model, int topSpeed) { this.Model = model; this.TopSpeed = topSpeed; } public Automobile() { // TODO: Complete member initialization } public void Start() { throw new NotImplementedException(); } public bool IsRunning { get; set; } }
テストを実行するには
単体テスト メニューのポイント 単体テストの実行、し すべてのテスト。このコマンドでは、現在のソリューションに対して記述されたすべてのテスト フレームワークのすべてのテストが実行されます。
この場合は、2 つのテストがあり、予想どおりどちらも失敗します。DefaultAutomobileIsInitializedCorrectly テストは、Assert.IsTrue 条件が False を返すため失敗します。AutomobileWithModelNameCanStart テストは、Automobile クラスの Start メソッドが例外をスローするため失敗します。
次の図にテスト結果ウィンドウを示します。
テスト結果ウィンドウ
[テスト結果] ウィンドウで、各テスト結果の行をダブルクリックして、テストが失敗したそれぞれの場所に移動します。
ソース コードを実装するには
次のコードを既定のコンストラクターに追加して、Model、TopSpeed、および IsRunning の各プロパティがすべて "Not specified"、-1、および True (true) の適切な既定値に初期化されるようにします。
Sub New() Model = "Not specified" TopSpeed = -1 IsRunning = True End Sub
public Automobile() { this.Model = "Not specified"; this.TopSpeed = -1; this.IsRunning = true; }
Start メソッドが呼び出されると、このメソッドは、Model プロパティまたは TopSpeed プロパティが既定値以外の値に設定されている場合にのみ IsRunning フラグを true に設定します。メソッド本体から NotImplementedException を削除し、次のコードを追加します。
Sub Start() If Model <> "Not specified" Or TopSpeed <> -1 Then IsRunning = True Else IsRunning = False End If End Sub
public void Start() { if (this.Model != "Not specified" || this.TopSpeed != -1) this.IsRunning = true; else this.IsRunning = false; }
テストを再実行するには
[テスト] メニューの [実行] をポイントし、[ソリューションのすべてのテスト] をクリックします。今回はテストが成功します。次の図にテスト結果ウィンドウを示します。
テスト結果ウィンドウ