チュートリアル: 使用法から生成機能のテスト ファースト開発Walkthrough: Test-first development with the Generate From Usage feature

このトピックでは、テスト ファースト開発をサポートする使用法から生成機能の使用方法について説明します。This topic demonstrates how to use the Generate From Usage feature, which supports test-first development.

テスト ファースト開発 は、最初に製品仕様に基づいて単体テストを記述してから、テストが成功するために必要なソース コードを記述するソフトウェア設計の方法です。Test-first development is an approach to software design in which you first write unit tests based on product specifications, and then write the source code that is required to make the tests succeed. Visual Studio は、新しい型とメンバーを定義する前に、テスト ケースで最初にこれらを参照するときにソース コードに生成することで、テスト ファースト開発をサポートします。Visual Studio supports test-first development by generating new types and members in the source code when you first reference them in your test cases, before they are defined.

Visual Studio では、新しい型とメンバーを生成する際、ワークフローへの割り込みは最小限に抑えられます。Visual Studio generates the new types and members with minimal interruption to your workflow. 現在のコード位置から離れずに、型、メソッド、プロパティ、フィールド、またはコンストラクターのスタブを作成できます。You can create stubs for types, methods, properties, fields, or constructors without leaving your current location in code. ダイアログ ボックスを開いて型生成のオプションを指定すると、ダイアログ ボックスを閉じたときに、現在開いているファイルにフォーカスがすぐに戻ります。When you open a dialog box to specify options for type generation, the focus returns immediately to the current open file when the dialog box closes.

使用法から生成機能は、Visual Studio と統合されるテスト フレームワークで使用することができます。The Generate From Usage feature can be used with test frameworks that integrate with Visual Studio. このトピックでは、Microsoft 単体テスト フレームワークについて説明します。In this topic, the Microsoft Unit Testing Framework is demonstrated.


次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。The Visual Studio edition that you have and the settings that you use determine these elements. 詳細については、「IDE をカスタマイズする」をご覧ください。For more information, see Personalizing the IDE.

Windows クラス ライブラリ プロジェクトとテスト プロジェクトを作成するCreate a Windows Class Library project and a Test project

  1. Visual C#Visual C# または Visual BasicVisual Basic で、新しい Windows クラス ライブラリ プロジェクトを作成します。In Visual C#Visual C# or Visual BasicVisual Basic, create a new Windows Class Library project. 使用している言語に応じて GFUDemo_VB または GFUDemo_CSという名前を付けます。Name it GFUDemo_VB or GFUDemo_CS, depending on which language you are using.

  2. ソリューション エクスプローラーの上部にあるソリューション アイコンを右クリックし、[追加] を選択してから [新しいプロジェクト] を選択します。In Solution Explorer, right-click the solution icon at the top, choose Add, and then choose New Project. [新しいプロジェクト] ダイアログ ボックスの左ペインで、[テスト] を選択します。In the left pane of the New Project dialog box, choose Test.

  3. 中央のペインで、[単体テスト プロジェクト] を選択し、UnitTestProject1 の既定の名前をそのまま使用します。In the middle pane, choose Unit Test Project and accept the default name of UnitTestProject1. Visual C#Visual C# で表示されるダイアログ ボックスを次の図に示します。The following illustration shows the dialog box when it appears in Visual C#Visual C#. Visual BasicVisual Basic のダイアログ ボックスも同様です。In Visual BasicVisual Basic, the dialog box looks similar.

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

  4. [OK] を選択して、[新しいプロジェクト] ダイアログ ボックスを閉じます。Choose OK to close the New Project dialog box.

クラス ライブラリ プロジェクトに参照を追加するAdd a reference to the Class Library project

  1. ソリューション エクスプローラーで、単体クラス プロジェクトの [参照] エントリを右クリックし、[参照の追加] を選択します。In Solution Explorer, under your unit test project, right-click the References entry and choose Add Reference.

  2. [参照マネージャー] ダイアログ ボックスで、[プロジェクト] を選択してからクラス ライブラリ プロジェクトを選択します。In the Reference Manager dialog box, select Projects and then select the class library project.

  3. [OK] を選択して [参照マネージャー] ダイアログ ボックスを閉じます。Choose OK to close the Reference Manager dialog box.

  4. ソリューションを保存します。Save your solution. これで、テストの記述を開始できるようになりました。You are now ready to begin writing tests.

単体テストから新しいクラスを生成するGenerate a new class from a unit test

  1. テスト プロジェクトには、UnitTest1 という名前のファイルが含まれています。The test project contains a file that is named UnitTest1. ソリューション エクスプローラー でこのファイルをダブルクリックして、コード エディターで開きます。Double-click this file in Solution Explorer to open it in the code editor. テスト クラスとテスト メソッドが生成されています。A test class and test method have been generated.

  2. クラス UnitTest1 の宣言を検索して、この名前を AutomobileTestに変更します。Locate the declaration for class UnitTest1 and rename it to AutomobileTest.


    現在、IntelliSense では、IntelliSense のステートメント入力候補に対して、 完了モード提案モードの 2 つの方法を提供しています。IntelliSense now provides two alternatives for IntelliSense statement completion: completion mode and suggestion mode. まだ定義していないクラスやメンバーを使用する場合は、提案モードを使用します。Use suggestion mode for situations in which classes and members are used before they are defined. IntelliSense ウィンドウが開いているときに、Ctrl+Alt+Space キーを押すと、完了モードと提案モードを切り替えることができます。When an IntelliSense window is open, you can press Ctrl+Alt+Space to toggle between completion mode and suggestion mode. 詳細については、IntelliSense の使用に関するページを参照してください。See Use IntelliSense for more information. 提案モードは、次の手順で「 Automobile 」と入力する際に役立ちます。Suggestion mode will help when you are typing Automobile in the next step.

  3. TestMethod1() メソッドを検索して、この名前を DefaultAutomobileIsInitializedCorrectly()に変更します。Locate the TestMethod1() method and rename it to DefaultAutomobileIsInitializedCorrectly(). 次のスクリーンショットに示されているように、このメソッド内に Automobile というクラスの新しいインスタンスを作成します。Inside this method, create a new instance of a class named Automobile, as shown in the following screenshots. コンパイル時のエラーを示す波下線が表示され、クイック アクション (電球) が左の余白に表示される (C# のみ) か、カーソルを移動すると波線の下に直接表示されます。A wavy underline appears, which indicates a compile-time error, and a Quick Actions light bulb appears in the left margin (C# only), or directly below the squiggle if you hover over it.

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

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

  4. クイック アクション (電球) を選択するかクリックします。Choose or click the Quick Actions light bulb. Automobile 型が定義されていないことを示すエラー メッセージが表示されます。You'll see an error message that states that the type Automobile is not defined. ソリューションもいくつか表示されます。You are also presented with some solutions.

  5. [新しい型の生成] をクリックして、[型の生成] ダイアログ ボックスを開きます。Click Generate new type to open the Generate Type dialog box. このダイアログ ボックスでは、別のプロジェクトでの型の生成を含むオプションが提供されます。This dialog box provides options that include generating the type in a different project.

  6. [プロジェクト] の一覧で、[GFUDemo_VB] または [GFUDemo_CS] をクリックして、テスト プロジェクトではなくクラス ライブラリ プロジェクトにファイルを追加するように Visual Studio に指示します。In the Project list, click GFUDemo_VB or GFUDemo_CS to instruct Visual Studio to add the file to the class library project instead of the test project. [新しいファイルの作成] がまだ選択されていない場合は選択し、Automobile.cs または Automobile.vb という名前を付けます。If it's not already selected, choose Create new file and name it Automobile.cs or Automobile.vb.

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

  7. [OK] をクリックしてダイアログ ボックスを閉じ、新しいファイルを作成します。Click OK to close the dialog box and create the new file.

  8. ソリューション エクスプローラーで、GFUDemo_VB または GFUDemo_CS プロジェクト ノードの下に新しい Automobile.vb または Automobile.cs ファイルが存在することを確認します。In Solution Explorer, look under the GFUDemo_VB or GFUDemo_CS project node to verify that the new Automobile.vb or Automobile.cs file is there. コード エディターでは、まだ AutomobileTest.DefaultAutomobileIsInitializedCorrectly にフォーカスがあり、中断を最小限に抑えて、テストの記述を続行できます。In the code editor, the focus is still in AutomobileTest.DefaultAutomobileIsInitializedCorrectly, which enables you to continue to write your test with a minimum of interruption.

プロパティ スタブを生成するGenerate a property stub

Automobile クラスに ModelTopSpeedという 2 つのパブリック プロパティがあることを示す製品仕様があるとします。Assume that the product specification states that the Automobile class has two public properties named Model and TopSpeed. これらのプロパティは、既定のコンストラクターによって、 "Not specified"-1 の既定値で初期化されている必要があります。These properties must be initialized with default values of "Not specified" and -1 by the default constructor. 次の単体テストでは、既定のコンストラクターが適切な既定値にプロパティを設定することを検証します。The following unit test will verify that the default constructor sets the properties to their correct default values.

  1. DefaultAutomobileIsInitializedCorrectly テスト メソッドに次のコード行を追加します。Add the following line of code to the DefaultAutomobileIsInitializedCorrectly test method.

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    Assert.IsTrue((myAuto.Model = "Not specified") And (myAuto.TopSpeed = -1))
  2. コードは Automobile の 2 つの未定義プロパティを参照するため、ModelTopSpeed の下に波下線が表示されます。Because the code references two undefined properties on Automobile, a wavy underline appears under Model and TopSpeed. Model にカーソルを移動し、クイック アクション (電球) を選択してから、[プロパティ 'Automobile.Model' を生成します] を選択します。Hover over Model and choose the Quick Actions light bulb, then choose Generate property 'Automobile.Model'.

  3. TopSpeed プロパティのプロパティ スタブも同様に生成します。Generate a property stub for the TopSpeed property in the same way.

    Automobile クラスでは、新しいプロパティの型はコンテキストから正しく推定されます。In the Automobile class, the types of the new properties are correctly inferred from the context.

新しいコンストラクターのスタブを生成するGenerate a stub for a new constructor

ここでは、Model および TopSpeed プロパティを初期化するコンストラクター スタブを生成するテスト メソッドを作成します。Now we'll create a test method that will generate a constructor stub to initialize the Model and TopSpeed properties. 後でコードを追加してテストを完成させます。Later, you'll add more code to complete the test.

  1. 次の追加のテスト メソッドを AutomobileTest クラスに追加します。Add the following additional test method to your AutomobileTest class.

    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' にコンストラクターを生成します] をクリックします。Click the Quick Actions light bulb under the red squiggle, and then click Generate constructor in 'Automobile'.

    Automobile クラス ファイルで、新しいコンストラクターがコンストラクター呼び出しで使用されているローカル変数の名前を調べ、 Automobile クラスで同じ名前のプロパティを見つけ、 Model および TopSpeed プロパティに引数値を格納するためのコードをコンストラクター本体に指定に指定したことがわかりますIn the Automobile class file, notice that the new constructor has examined the names of the local variables that are used in the constructor call, found properties that have the same names in the Automobile class, and supplied code in the constructor body to store the argument values in the Model and TopSpeed properties.

  3. 新しいコンストラクターを生成すると、 DefaultAutomobileIsInitializedCorrectlyの既定のコンストラクター呼び出しの下に波線が表示されます。After you generate the new constructor, a wavy underline appears under the call to the default constructor in DefaultAutomobileIsInitializedCorrectly. Automobile クラスには、0 個の引数を受け取るコンストラクターがないことを示すエラー メッセージが表示されます。The error message states that the Automobile class has no constructor that takes zero arguments. パラメーターを持たない明示的な既定のコンストラクターを生成するには、クイック アクション (電球) をクリックし、['Automobile' にコンストラクターを生成します] をクリックします。To generate an explicit default constructor that does not have parameters, click the Quick Actions light bulb, and then click Generate constructor in 'Automobile'.

メソッドのスタブを生成するGenerate a stub for a method

仕様で、Model および TopSpeed プロパティが既定値以外に設定されている場合は、新しい AutomobileIsRunning 状態にできることが示されているとします。Assume that the specification states that a new Automobile can be put into a IsRunning state if its Model and TopSpeed properties are set to something other than the default values.

  1. 次の行を AutomobileWithModelNameCanStart メソッドに追加します。Add the following lines to the AutomobileWithModelNameCanStart method.

    Assert.IsTrue(myAuto.IsRunning == true);
    Assert.IsTrue(myAuto.IsRunning = True)
  2. myAuto.Start メソッド呼び出しのクイック アクション (電球) をクリックしてから、[メソッド 'Automobile.Start' を生成します] をクリックします。Click the Quick Actions light bulb for the myAuto.Start method call and then click Generate method 'Automobile.Start'.

  3. IsRunning プロパティのクイック アクション (電球) をクリックしてから、[プロパティ 'Automobile.IsRunning' を生成します] をクリックします。Click the Quick Actions light bulb for the IsRunning property and then click Generate property 'Automobile.IsRunning'.

    これで、Automobile クラスに Start() という名前のメソッドと IsRunning という名前のプロパティが含まれるようになりました。The Automobile class now contains a method named Start() and a property named IsRunning.

テストを実行Run the tests

  1. [テスト] メニューで [実行] > [すべてのテスト] を選びます。On the Test menu, choose Run > All Tests.

    [実行] > [すべてのテスト] コマンドは、現在のソリューション用に作成されたテスト フレームワークですべてのテストを実行します。The Run > All Tests command runs all the tests in any test frameworks that are written for the current solution. この場合、2 つのテストがありますが、どちらも失敗することが予想されます。In this case, there are two tests, and they both fail, as expected. DefaultAutomobileIsInitializedCorrectly テストは、 Assert.IsTrue 条件が Falseを返すため失敗します。The DefaultAutomobileIsInitializedCorrectly test fails because the Assert.IsTrue condition returns False. AutomobileWithModelNameCanStart テストは、 Start クラスの Automobile メソッドが例外をスローするため失敗します。The AutomobileWithModelNameCanStart test fails because the Start method in the Automobile class throws an exception.

    次の図に [テスト結果] ウィンドウを示します。The Test Results window is shown in the following illustration.


  2. [テスト結果] ウィンドウで、各テスト結果の行をダブルクリックして、各テストの場所に移動します。In the Test Results window, double-click on each test result row to go to the location of each test.

ソース コードを実装するImplement the source code

  1. 次のコードを既定のコンストラクターに追加して、ModelTopSpeed および IsRunning のプロパティがすべて "Not specified"-1 および False (C# の場合は false) の適切な既定値に初期化されるようにします。Add the following code to the default constructor so that the Model, TopSpeed and IsRunning properties are all initialized to their correct default values of "Not specified", -1, and False (or false for C#).

    public Automobile()
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = false;
    Sub New()
        Model = "Not specified"
        TopSpeed = -1
        IsRunning = False
    End Sub
  2. Start メソッドが呼び出されたときに、 IsRunning または Model プロパティが既定値以外に設定されている場合にのみ TopSpeed フラグを true に設定する必要があります。When the Start method is called, it should set the IsRunning flag to true only if the Model or TopSpeed properties are set to something other than their default value. メソッド本体から NotImplementedException を削除して次のコードを追加します。Remove the NotImplementedException from the method body and add the following code.

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

テストをもう一度実行するRun the tests again

  • [テスト] メニューの [実行] をポイントし、[すべてのテスト] をクリックします。On the Test menu, point to Run, and then click All Tests.

    今回はテストに合格します。This time the tests pass. 次の図に [テスト結果] ウィンドウを示します。The Test Results window is shown in the following illustration.


関連項目See also