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

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

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

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

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

注意

この記事で紹介する Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 Visual Studio のエディションや環境設定がお使いのものと異なる場合があります。 詳細については、「Visual Studio IDE のカスタマイズ」を参照してください。

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

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

  2. ソリューション エクスプローラーの上部にあるソリューション アイコンを右クリックし、 [追加]>[新しいプロジェクト] の順に選択します。

  3. 新しい単体テスト プロジェクト (.NET Framework) プロジェクトを作成します。

クラス ライブラリ プロジェクトに参照を追加する

  1. ソリューション エクスプローラーで、単体クラス プロジェクトの [参照] エントリを右クリックし、 [参照の追加] を選択します。

  2. [参照マネージャー] ダイアログ ボックスで、 [プロジェクト] を選択してからクラス ライブラリ プロジェクトを選択します。

  3. [OK] を選択して [参照マネージャー] ダイアログ ボックスを閉じます。

  4. ソリューションを保存します。 これで、テストの記述を開始できるようになりました。

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

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

  2. クラス UnitTest1 の宣言を検索して、この名前を AutomobileTestに変更します。

    注意

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

  3. TestMethod1() メソッドを検索して、この名前を DefaultAutomobileIsInitializedCorrectly()に変更します。 次のスクリーンショットに示されているように、このメソッド内に Automobile というクラスの新しいインスタンスを作成します。 コンパイル時のエラーを示す波下線が表示され、クイック アクションのエラー電球が左の余白に表示されるか、カーソルを移動すると波線の下に直接表示されます。

    Visual Basic のクイック アクション

    C# のクイック アクション

  4. クイック アクション (電球) を選択するかクリックします。 Automobile 型が定義されていないことを示すエラー メッセージが表示されます。 ソリューションもいくつか表示されます。

  5. [新しい型の生成] をクリックして、 [型の生成] ダイアログ ボックスを開きます。 このダイアログ ボックスでは、別のプロジェクトでの型の生成を含むオプションが提供されます。

  6. [プロジェクト] の一覧で、[GFUDemo_VB] または [GFUDemo_CS] をクリックして、テスト プロジェクトではなくクラス ライブラリ プロジェクトにファイルを追加するように Visual Studio に指示します。 [新しいファイルの作成] がまだ選択されていない場合は選択し、Automobile.cs または Automobile.vb という名前を付けます。

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

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

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

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

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

  1. DefaultAutomobileIsInitializedCorrectly テスト メソッドに次のコード行を追加します。

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
  2. コードは Automobile の 2 つの未定義プロパティを参照するため、ModelTopSpeed の下に波下線が表示されます。 Model にカーソルを移動し、クイック アクションのエラー電球を選択してから、 [プロパティ 'Automobile.Model' を生成します] を選択します。

  3. TopSpeed プロパティのプロパティ スタブも同様に生成します。

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

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

ここでは、Model および TopSpeed プロパティを初期化するコンストラクター スタブを生成するテスト メソッドを作成します。 後でコードを追加してテストを完成させます。

  1. 次の追加のテスト メソッドを AutomobileTest クラスに追加します。

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. 赤い波線の下にあるクイック アクションのエラー電球をクリックしてから、 ['Automobile' にコンストラクターを生成します] をクリックします。

    Automobile クラス ファイルで、新しいコンストラクターがコンストラクター呼び出しで使用されているローカル変数の名前を調べ、 Automobile クラスで同じ名前のプロパティを見つけ、 Model および TopSpeed プロパティに引数値を格納するためのコードをコンストラクター本体に指定に指定したことがわかります

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

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

仕様で、Model および TopSpeed プロパティが既定値以外に設定されている場合は、新しい AutomobileIsRunning 状態にできることが示されているとします。

  1. 次の行を AutomobileWithModelNameCanStart メソッドに追加します。

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. myAuto.Start メソッド呼び出しのクイック アクションのエラー電球をクリックしてから、[メソッド 'Automobile.Start' を生成します] をクリックします。

  3. IsRunning プロパティのクイック アクション (電球) をクリックしてから、[プロパティ 'Automobile.IsRunning' を生成します] をクリックします。

    これで、Automobile クラスに Start() という名前のメソッドと IsRunning という名前のプロパティが含まれるようになりました。

テストを実行

  1. [テスト] メニューで [実行]>[すべてのテスト] を選択します。

    [実行]>[すべてのテスト] コマンドは、現在のソリューション用に作成されたテスト フレームワークですべてのテストを実行します。 この場合、2 つのテストがありますが、どちらも失敗することが予想されます。 DefaultAutomobileIsInitializedCorrectly テストは、 Assert.IsTrue 条件が Falseを返すため失敗します。 AutomobileWithModelNameCanStart テストは、 Start クラスの Automobile メソッドが例外をスローするため失敗します。

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

    失敗したテストの結果

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

ソース コードを実装する

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

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  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;
    }
    

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

  • [テスト] メニューの [実行] をポイントし、 [すべてのテスト] をクリックします。

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

    合格したテストの結果