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

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

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

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

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

> [!NOTE] > 次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。 詳細については、「IDE をカスタマイズする」をご覧ください。

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

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

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

  3. [テンプレート] ペインで、 [単体テスト プロジェクト] をクリックして UnitTestProject1 の既定の名前をそのまま使用します。 Visual C# で表示されるダイアログ ボックスを次の図に示します。 Visual Basic のダイアログ ボックスも同様です。

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

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

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

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

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

    注意

    現在、IntelliSense では、IntelliSense のステートメント入力候補に対して、 完了モード提案モードの 2 つの方法を提供しています。 まだ定義していないクラスやメンバーを使用する場合は、提案モードを使用します。 [IntelliSense] ウィンドウが開いているときに、Ctrl キーと Alt キーを押しながら Space キーを押すと完了モードと提案モードを切り替えることができます。 詳しくは、「IntelliSense の使用」をご覧ください。 提案モードは、次の手順で「 Automobile 」と入力する際に役立ちます。

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

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

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

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

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

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

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

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

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

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

  7. ソリューション エクスプローラーで、GFUDemo_VB または GFUDemo_CS プロジェクト ノードの下に新しい Automobile.vb または Automobile.cs ファイルが存在することを確認します。 コード エディターでは、フォーカスがまだ AutomobileTest.DefaultAutomobileIsInitializedCorrectlyにあります。 中断を最小限に抑えて、テストの記述を続行できます。

プロパティ スタブを生成するには

  1. Automobile クラスに ModelTopSpeedという 2 つのパブリック プロパティがあることを示す製品仕様があるとします。 これらのプロパティは、既定のコンストラクターによって、 "Not specified"-1 の既定値で初期化されている必要があります。 次の単体テストでは、既定のコンストラクターが適切な既定値にプロパティを設定することを検証します。

    DefaultAutomobileIsInitializedCorrectlyに次のコード行を追加します。

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
    Assert.IsTrue((myAuto.Model = "Not specified") And (myAuto.TopSpeed = -1))
    

    コードは Automobileの 2 つの未定義プロパティを参照するため、スマート タグが表示されます。 Model のスマート タグをクリックし、 [プロパティ スタブの生成]をクリックします。 TopSpeed プロパティのプロパティ スタブも生成します。

    Automobile クラスでは、新しいプロパティの型はコンテキストから正しく推定されます。

    スマート タグのショートカット メニューを次の図に示します。

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

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

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

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

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

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

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

    [移動] ダイアログ
    [移動] ウィンドウ

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

  1. このテスト メソッドでは、指定した値を持つように Model および TopSpeed プロパティを初期化するコンストラクター スタブが生成されます。 後でコードを追加してテストを完成させます。 次の追加のテスト メソッドを AutomobileTest クラスに追加します。

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
    <TestMethod()> Public Sub AutomobileWithModelNameCanStart()
        Dim model As String = "Contoso"
        Dim topSpeed As Integer = 199
        Dim myAuto As New Automobile(model, topSpeed)
    End Sub
    

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

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

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

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

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
    myAuto.Start()
    Assert.IsTrue(myAuto.IsRunning = True)
    

  2. myAuto.Start メソッド呼び出しのスマート タグをクリックし、 [メソッド スタブの生成]をクリックします。

  3. IsRunning プロパティのスマート タグをクリックし、 [プロパティ スタブの生成]をクリックします。 Automobile クラスには、次のコードが含まれています。

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

テストを実行するには

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

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

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

    失敗したテストの結果
    [テスト結果] ウィンドウ

  2. [テスト結果] ウィンドウで、各テスト結果の行をダブルクリックして、各テストのエラーの発生場所に移動します。

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

  1. 次のコードを既定のコンストラクターに追加して、 ModelTopSpeed および IsRunning のプロパティがすべて "Not specified"-1および True (true) の適切な既定値に初期化されるようにします。

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
    Sub New()
        Model = "Not specified"
        TopSpeed = -1
        IsRunning = True
    End Sub
    

  2. Start メソッドが呼び出されたときに、 IsRunning または Model プロパティが既定値以外に設定されている場合にのみ TopSpeed フラグを true に設定する必要があります。 メソッド本体から NotImplementedException を削除して次のコードを追加します。

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    
    Sub Start()
        If Model <> "Not specified" Or TopSpeed <> -1 Then
            IsRunning = True
        Else
            IsRunning = False
        End If
    End Sub
    

テストをもう一度実行するには

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

    合格したテストの結果
    [テスト結果] ウィンドウ

関連項目

使用法から生成
コードの作成
IntelliSense の使用
コードの単体テスト