チュートリアル: 使用法から生成機能のテスト ファーストのサポート

このトピックでは、テスト ファースト開発をサポートする使用法から生成機能の使用方法を示します。

テスト ファースト開発は、最初に製品仕様に基づいて単体テストを記述してから、テストを成功させるために必要なソース コードを記述するソフトウェア設計のアプローチです。 Visual Studio では、新しい型とメンバーを定義する前に、テスト ケースで最初に参照するときにそれらをソース コードに生成することで、テスト ファースト開発をサポートします。

Visual Studio では、ワークフローの中断を最小限にして新しい型とメンバーが生成されます。 現在のコード位置から離れずに、型、メソッド、プロパティ、フィールド、またはコンストラクターのスタブを作成できます。 ダイアログ ボックスを開いて型生成のオプションを指定すると、ダイアログ ボックスを閉じたときに、現在開いているファイルにフォーカスがすぐに戻ります。

使用法から生成機能は、Visual Studio と統合されるテスト フレームワークで使用できます。 このトピックでは、Microsoft 単体テスト フレームワークについて説明します。

注意

このチュートリアルは、Visual Basic 開発設定または Visual C# 開発設定を考慮して記述されています。 チュートリアルでは、他の設定も扱います。

推奨設定を変更するには、次の手順を使用します。[ツール] メニューの [設定のインポートとエクスポート] をクリックします。 [設定のインポートとエクスポート ウィザード] の最初のページで、[すべての設定をリセット] をクリックします。 [設定の既定のコレクションの選択] ページで、[Visual Basic 開発設定] または [Visual C# 開発設定] をクリックします。

Windows クラス ライブラリ プロジェクトとテスト プロジェクトを作成するには

  1. Visual C# または Visual Basic で、新しい Windows クラス ライブラリ プロジェクトを作成します。 使用している言語に応じて、プロジェクトに GFUDemo_VB または GFUDemo_CS という名前を付けます。

  2. ソリューション エクスプローラーの上部にあるソリューション アイコンを右クリックし、[追加] をポイントして [新しいプロジェクト] をクリックします。 [新しいプロジェクト] ダイアログ ボックスの左側にある [プロジェクトの種類] ペインで、[テスト] をクリックします。

  3. [テンプレート] ペインで、[テスト プロジェクト] をクリックし、TestProject1 という既定の名前を受け入れます。 次の図は、Visual C# に表示されるダイアログ ボックスを示しています。 Visual Basic でも、ダイアログ ボックスは同様の外観になります。

    [新しいプロジェクト] ダイアログ ボックス

    [新しいテスト プロジェクト] ダイアログ

  4. [OK] をクリックして、[新しいプロジェクト] ダイアログ ボックスを閉じます。 これで、テストの記述を開始できるようになりました。

単体テストから新しいクラスを生成するには

  1. テスト プロジェクトには、UnitTest1 という名前のファイルが含まれています。 ソリューション エクスプローラーで、このファイルをダブルクリックしてコード エディターで開きます。 テスト クラスとテスト メソッドが生成されています。

  2. UnitTest1 クラスの宣言を検索し、名前を AutomobileTest に変更します。 C# では、UnitTest1() コンストラクターが存在する場合は名前を AutomobileTest() に変更します。

    注意

    現在、IntelliSense のステートメント入力候補には、入力候補モードと候補提示モードの 2 種類があります。 まだ定義していないクラスやメンバーを使用する場合は、候補提示モードを使用します。 IntelliSense ウィンドウが開いているときに Ctrl + Alt + Space キーを押すと、IntelliSense の入力候補モードと候補提示モードを切り替えることができます。 詳細については、「メンバーの一覧」を参照してください。 候補提示モードは、次の手順で「Automobile」と入力する場合に役立ちます。

  3. TestMethod1() メソッドを検索し、名前を DefaultAutomobileIsInitializedCorrectly() に変更します。 次の図に示すように、このメソッドの内部に、Automobile というクラスの新しいインスタンスを作成します。 コンパイル時のエラーを示す波線が表示され、型名の下にスマート タグが表示されます。 スマート タグの厳密な場所は、Visual Basic と Visual C# のどちらを使用しているかによって異なります。

    Visual Basic

    スマート タグの下線 (Visual Basic)

    Visual C#

    スマート タグの下線 (C#)

  4. スマート タグの上にマウス ポインターを置くと、Automobile という名前の型がまだ定義されていないことを示すエラー メッセージが表示されます。 スマート タグをクリックするか、Ctrl キーを押しながら . (Ctrl + ピリオド) キーを押して、次の図に示す [使用法から生成] ショートカット メニューを開きます。

    Visual Basic

    スマート タグのコンテキスト メニュー (Visual Basic)

    Visual C#

    スマート タグのコンテキスト メニュー (C#)

  5. ここで、2 つの選択肢があります。 ['Automobile クラス' を生成] をクリックすると、テスト プロジェクトに新しいファイルを作成し、Automobile という空のクラスを設定できます。 この方法では、現在のプロジェクトの新しいファイル内に既定のアクセス修飾子を持つ新しいクラスをすばやく作成できます。 [新しい型の生成] をクリックして、[新しい型の生成] ダイアログ ボックスを開くこともできます。 これには、既存のファイルへのクラスの挿入や別のプロジェクトへのファイルの追加などのオプションがあります。

    [新しい型の生成] をクリックして、次の図に示す [新しい型の生成] ダイアログ ボックスを開きます。 [プロジェクト] の一覧で、[GFUDemo_VB] または [GFUDemo_CS] をクリックして、テスト プロジェクトではなくソース コード プロジェクトにファイルを追加するように Visual Studio に指示します。

    [新しい型の生成] ダイアログ ボックス

    [新しい型の生成] ダイアログ ボックス

  6. [OK] をクリックしてダイアログ ボックスを閉じ、新しいファイルを作成します。

  7. ソリューション エクスプローラーで、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 Basic)

    Visual C#

    プロパティ生成のコンテキスト メニュー (C#)

ソース コードを検索するには

  • 新しいプロパティが生成されていることを確認するために、[移動] 機能を使用して、Automobile.cs または Automobile.vb のソース コード ファイルに移動します。

    [移動] 機能を使用すると、型名や名前の一部などのテキスト文字列をすばやく入力し、結果の一覧の要素をクリックして目的の場所に移動できます。

    [移動] ダイアログ ボックスを開くには、コード エディター内をクリックし、Ctrl キーを押しながら , (Ctrl + コンマ) キーを押します。 テキスト ボックスに「automobile」と入力します。 一覧で [Automobile] クラスを選択し、[OK] をクリックします。

    次の図に [移動] ウィンドウを示します。

    [移動] ウィンドウ

    [移動先] ダイアログ

新しいコンストラクターのスタブを生成するには

  1. このテスト メソッドでは、指定した値を持つように 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);
    }
    
  2. 新しいクラス コンストラクターの下のスマート タグをクリックし、[コンストラクター スタブの生成] をクリックします。 Automobile クラス ファイルで、新しいコンストラクターが、コンストラクター呼び出しで使用されているローカル変数の名前を調べ、同じ名前のプロパティを Automobile クラスに見つけ、引数値を Model プロパティおよび TopSpeed プロパティに格納するためのコードをコンストラクター本体に指定したことがわかります (Visual Basic では、新しいコンストラクターの _model フィールドおよび _topSpeed フィールドは、Model プロパティおよび TopSpeed プロパティの暗黙に定義されたバッキング フィールドです)。

  3. 新しいコンストラクターを生成した後で、DefaultAutomobileIsInitializedCorrectly の既定のコンストラクターへの呼び出しの下に波線が表示されます。 エラー メッセージには、Automobile クラスに 0 個の引数を受け取るコンストラクターがないことが示されます。 パラメーターを持たない明示的な既定のコンストラクターを生成するには、スマート タグをクリックし、[コンストラクター スタブの生成] をクリックします。

メソッドのスタブを生成するには

  1. 仕様で、Model プロパティおよび TopSpeed プロパティが既定値以外の値に設定されている場合に新しい Automobile を実行状態にできることが規定されているとします。 AutomobileWithModelNameCanStart メソッドに次の行を追加します。

    myAuto.Start()
    Assert.IsTrue(myAuto.IsRunning = True)
    
    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. myAuto.Start メソッド呼び出しのスマート タグをクリックし、[メソッド スタブの生成] をクリックします。

  3. 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; }
    }
    

テストを実行するには

  1. [テスト] メニューの [実行] をポイントし、[ソリューションのすべてのテスト] をクリックします。 このコマンドでは、現在のソリューションに対して記述されたすべてのテスト フレームワークのすべてのテストが実行されます。

    この場合は、2 つのテストがあり、予想どおりどちらも失敗します。 DefaultAutomobileIsInitializedCorrectly テストは、Assert.IsTrue 条件が False を返すため失敗します。 AutomobileWithModelNameCanStart テストは、Automobile クラスの Start メソッドが例外をスローするため失敗します。

    次の図にテスト結果ウィンドウを示します。

    テスト結果ウィンドウ

    失敗したテストの結果

  2. [テスト結果] ウィンドウで、各テスト結果の行をダブルクリックして、テストが失敗したそれぞれの場所に移動します。

    注意

    ダブルクリックしても、コード内の、テストが失敗した場所に移動しない場合は、次の手順を実行してこの機能を有効にできます。[ツール] メニューの [オプション] をクリックし、[テスト ツール] を展開して [テストの実行] をクリックします。 [失敗または結果不確定の単体テストの結果をダブルクリックした場合にテストの失敗箇所を表示する] チェック ボックスをオンにします。

ソース コードを実装するには

  1. 次のコードを既定のコンストラクターに追加して、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;
    }
    
  2. 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;
    }
    

テストを再実行するには

  • [テスト] メニューの [実行] をポイントし、[ソリューションのすべてのテスト] をクリックします。 今回はテストが成功します。 次の図にテスト結果ウィンドウを示します。

    テスト結果ウィンドウ

    合格したテストの結果

参照

処理手順

方法 : オブジェクト、定義、および参照 (シンボル) を検索する

参照

メンバーの一覧

概念

使用法から生成