クイック スタート: テスト エクスプローラーによるテスト駆動開発Quick Start: Test Driven Development with Test Explorer

変更を繰り返して段階的に開発を行ううえで、コードの正しい動作を維持するには、単体テストを作成することをお勧めします。We recommend that you create unit tests to help keep your code working correctly through many incremental steps of development. サード パーティ製を含めていくつかのフレームワークを単体テストの記述に使用できます。There are several frameworks that you can use to write unit tests, including some developed by third parties. 一部のテスト フレームワークは、別々の言語またはプラットフォームでのテストに特化されています。Some test frameworks are specialized to testing in different languages or platforms. テスト エクスプローラーは、1 つのインターフェイスで、どのフレームワークでの単体テストにも対応します。Test Explorer provides a single interface for unit tests in any of these frameworks. 最も一般的に使用されるフレームワーク用にアダプターが用意されており、他のフレームワーク用に独自のアダプターを作成することもできます。Adapters are available for the most commonly-used frameworks, and you can write your own adapters for other frameworks.

テスト エクスプローラーは、Visual Studio の以前のエディションにあった単体テスト ウィンドウに代わる機能です。Test Explorer supersedes the unit test windows found in earlier editions of Visual Studio. これには次のような利点があります。Its benefits include:

  • .NET、アンマネージ、データベース、およびその他の種類のテストを 1 つのインターフェイスで実行できます。Run .NET, unmanaged, database and other kinds of tests using a single interface.

  • NUnit や MSTest など、任意の単体テスト フレームワークを使用できます。Use the unit test framework of your choice, such as NUnit or MSTest frameworks.

  • 必要な情報をすべて、1 つのウィンドウで確認できます。See in one window all the information that you need.

テスト エクスプローラーの使用Using Test Explorer

[すべて実行] ボタンを示す単体テスト エクスプローラーUnit Test Explorer showing Run All button

テスト エクスプローラーを使用して単体テストを実行するにはTo Run Unit Tests by using Test Explorer

  1. 任意のテスト フレームワークを使用して単体テストを作成します。Create unit tests that use the test frameworks of your choice.

    たとえば、MSTest フレームワークを使用するテストを作成するには:For example, to create a test that uses the MSTest Framework:

    1. テスト プロジェクトを作成します。Create a test project.

      [新しいプロジェクト] ダイアログ ボックスで、 [Visual Basic][Visual C#]、または [Visual C++]を展開し、 [テスト]をクリックします。In the New Project dialog box, expand Visual Basic, Visual C#, or Visual C++, and then choose Test.

      [単体テスト プロジェクト]を選択します。Select Unit Test Project.

    2. 各単体テストをメソッドとして記述します。Write each unit test as a method. 各テスト メソッドにプレフィックスとして [TestMethod] 属性を付けます。Prefix each test method with the [TestMethod] attribute.

  2. 個々のテストに実行順序を定める依存関係がない場合、ツール バーにある UTE_parallelicon-small トグル ボタンで並列テストの実行を有効にします。If individual tests have no dependencies that prevent them from being run in any order, turn on parallel test execution with the UTE_parallelicon-small toggle button on the toolbar. これにより、すべてのテスト実行にかかる時間を著しく短縮できます。This can noticeably reduce the time taken to run all the tests.

  3. メニュー バーで、 [テスト][単体テストの実行][すべてのテスト]の順にクリックします。On the menu bar, choose Test, Run Unit Tests, All Tests.

    ソリューションがビルドされ、テストが実行されます。The solution builds and the tests run.

    テスト エクスプローラーが開き、結果の概要が表示されます。Test Explorer opens and displays a summary of the results.

    テストの一覧を表示するには: 任意のカテゴリで、 [すべて表示] をクリックします。To see a full list of tests: Choose Show All in any category.

    テスト結果の詳細を表示するには: 例外メッセージなどの詳細を詳細ペインに表示するには、テスト エクスプローラーでテストを選択します。To see the details of a test result: Select the test in Test Explorer to view details such as exception messages in the details pane.

    テストのコードに移動するには: テスト エクスプローラーでテストをダブルクリックするか、ショートカット メニューの [テストを開く] をクリックします。To navigate to the code of a test: Double-click the test in Test Explorer, or choose Open Test on the shortcut menu.

    テストをデバッグするには: 1 つ以上のテストを選択し、ショートカット メニューの [選択したテストのデバッグ]をクリックします。To debug a test: Open the shortcut menu for one or more tests, and then choose Debug Selected Tests.

重要

最新のテスト実行の結果が表示されます。The results that are displayed are for the most recent run. 色分けされた結果バーに表示されるのは、実行されたテストの結果のみです。The colored results bar shows only the results for the tests that ran. たとえば、複数のテストを実行してそのいくつかに失敗し、次に成功したテストのみを実行した場合は、結果バーには緑色のみが表示されます。For example, if you run several tests and some of them fail, and then run only the successful tests, then the results bar will show all green.

注意

テストが表示されない場合は、使用するテスト フレームワークにテスト エクスプローラーを接続するためのアダプターがインストールされていることを確認してください。If no test appears, make sure that you have installed an adapter to connect Test Explorer to the test framework that you are using. 詳細については、「 テスト エクスプローラーでさまざまなテスト フレームワークを使用する」を参照してください。For more information, see Using Different Test Frameworks with Test Explorer.

チュートリアル: 単体テストを使用してメソッドを開発するWalkthrough: Using Unit Tests to Develop a Method

このチュートリアルでは、Microsoft 単体テスト フレームワークを使用して、テスト済みメソッドを C# で開発する方法を示します。This walkthrough demonstrates how to develop a tested method in C# using the Microsoft Unit Test framework. 他の言語に適合させることも、NUnit など他のテスト フレームワークを使用することも、容易です。You can easily adapt it for other languages, and to use other test frameworks such as NUnit. 詳細については、「 さまざまなテスト フレームワークを使用する」を参照してください。For more information, see Using Different Test Frameworks.

テストとメソッドを作成するCreating the Test and Method

  1. Visual C# クラス ライブラリ プロジェクトを作成します。Create a Visual C# Class Library project. このプロジェクトには、提供するコードを含めます。This project will contain the code that we want to deliver. この例では、 MyMathという名前が付いています。In this example, it is named MyMath.

  2. テスト プロジェクトを作成します。Create a Test project.

    • [新しいプロジェクト] ダイアログ ボックスで、 [Visual C#][テスト][単体テスト プロジェクト]の順にクリックします。In the New Project dialog, choose Visual C#, Test and then choose Unit Test Project.

      新しいコードとテスト プロジェクトNew code and test projects

  3. 基本的なテスト メソッドを記述します。Write a basic test method. 特定の入力に対して生じた結果を確認します。Verify the result obtained for a specific input:

    
    [TestMethod]  
    public void BasicRooterTest()  
    {  
      // Create an instance to test:  
      Rooter rooter = new Rooter();  
      // Define a test input and output value:  
      double expectedResult = 2.0;  
      double input = expectedResult * expectedResult;  
      // Run the method under test:  
      double actualResult = rooter.SquareRoot(input);  
      // Verify the result:  
      Assert.AreEqual(expectedResult, actualResult,  
          delta: expectedResult / 100);  
    }  
    
  4. テストからメソッドを生成します。Generate the method from the test.

    1. Rooterにカーソルを置き、ショートカット メニューで [生成][新しい型]の順にクリックします。Place the cursor on Rooter, and then on the shortcut menu choose Generate, New Type.

    2. [新しい型の生成] ダイアログ ボックスで、 [プロジェクト] をクラス ライブラリ プロジェクトに設定します。In the Generate New Type dialog box, set Project to the class library project. この例では、 MyMathです。In this example, it is MyMath.

    3. SquareRootにカーソルを置き、ショートカット メニューで [生成][メソッド スタブ]の順にクリックします。Place the cursor on SquareRoot, and then on the shortcut menu choose Generate, Method Stub.

  5. 単体テストを実行します。Run the unit test.

    1. [テスト] メニューで、 [単体テストの実行][すべてのテスト]の順にクリックします。On the Test menu, choose Run Unit Tests, All Tests.

      ソリューションがビルドされ、実行されます。The solution builds and runs.

      テスト エクスプローラーが開き、結果が表示されます。Test Explorer opens and displays the results.

      [失敗したテスト]の下にテストが表示されます。The test appears under Failed Tests.

  6. テストの名前を選択します。Select the name of the test.

    テストの詳細は、テスト エクスプローラーの下部に表示されます。The details of the test appear in the lower part of Test Explorer.

  7. テストに失敗した箇所を確認するには、 [スタック トレース] の下に表示されている項目を選択します。Select the items under Stack Trace to see where the test failed.

    テストの失敗を示す単体テスト エクスプローラー。Unit Test Explorer showing failed test.

    この時点で、テストとスタブが作成されています。テストに合格するには、これらを修正する必要があります。At this point, you have created a test and a stub that you will modify so that the test passes.

各変更後にすべてのテストに合格するAfter every change, make all the tests pass

  1. MyMath\Rooter.csで、 SquareRootのコードを改良します。In MyMath\Rooter.cs, improve the code of SquareRoot:

    public double SquareRoot(double input)  
     {  
       return input / 2;  
     }  
    
  2. テスト エクスプローラーで [すべて実行]をクリックします。In Test Explorer, choose Run All.

    テストがビルドされ、テストが実行されます。The code builds and the test runs.

    テストに合格します。The test passes.

    テストの成功を示す単体テスト エクスプローラー。Unit Test Explorer showing a passing test.

テストを追加して入力の範囲を拡張するAdd tests to extend the range of inputs

  1. あらゆる場合にコードが動作するという信頼性を強化するには、テストを追加して、より広範囲の入力値を試みます。To improve your confidence that your code works in all cases, add tests that try a broader range of input values.

    ヒント

    合格した既存のテストは変更しないでください。Avoid altering existing tests that pass. 代わりに、新しいテストを追加します。Instead, add new tests. 既存のテストを変更するのは、ユーザー要件が変更されたときのみに限定します。Change existing tests only when the user requirements change. このポリシーにより、コードを拡張する作業において既存の機能が失われる状況を回避できます。This policy helps ensure that you don't lose existing functionality as you work to extend the code.

    一定範囲の入力値を試みるために、次のテストをテスト クラスに追加します。In your test class, add the following test, which tries a range of input values:

    [TestMethod]  
    public void RooterValueRange()  
    {  
      // Create an instance to test:  
      Rooter rooter = new Rooter();  
      // Try a range of values:  
      for (double expectedResult = 1e-8;  
          expectedResult < 1e+8;  
          expectedResult = expectedResult * 3.2)  
      {  
        RooterOneValue(rooter, expectedResult);  
      }  
    }  
    
    private void RooterOneValue(Rooter rooter, double expectedResult)  
    {  
      double input = expectedResult * expectedResult;  
      double actualResult = rooter.SquareRoot(input);  
      Assert.AreEqual(expectedResult, actualResult,  
          delta: expectedResult / 1000);  
    }  
    
  2. テスト エクスプローラーで [すべて実行]をクリックします。In Test Explorer, choose Run All.

    最初のテストには今回も合格しますが、新しいテストには失敗します。The new test fails, although the first test still passes.

    エラー箇所を見つけるには、失敗したテストを選択し、テスト エクスプローラーの下部で、 [スタック トレース]の下に表示されている先頭の項目を選択します。To find the point of failure, select the failing test and then in the lower part of Test Explorer, select the top item of the Stack Trace.

  3. テスト対象のメソッドを調べて、問題点を確認します。Inspect the method under test to see what might be wrong. MyMath.Rooter クラスで、コードを書き直します。In the MyMath.Rooter class, rewrite the code:

    public double SquareRoot(double input)  
    {  
      double result = input;  
      double previousResult = -input;  
      while (Math.Abs(previousResult - result) > result / 1000)  
      {  
        previousResult = result;  
        result = result - (result * result - input) / (2 * result);  
      }  
      return result;  
    }  
    
  4. テスト エクスプローラーで [すべて実行]をクリックします。In Test Explorer, choose Run All.

    今回は、両方のテストに合格します。Both tests now pass.

例外的なケース用にテストを追加するAdd tests for exceptional cases

  1. 負数の入力用にテストを追加します。Add a test for negative inputs:

    [TestMethod]  
     public void RooterTestNegativeInputx()  
     {  
         Rooter rooter = new Rooter();  
         try  
         {  
             rooter.SquareRoot(-10);  
         }  
         catch (ArgumentOutOfRangeException e)  
         {  
             return;  
         }  
         Assert.Fail();  
     }  
    
  2. テスト エクスプローラーで [すべて実行]をクリックします。In Test Explorer, choose Run All.

    テスト対象のメソッドはループするため、実行を手動で取り消す必要があります。The method under test loops, and must be canceled manually.

  3. [キャンセル]をクリックします。Choose Cancel.

    テストが 10 秒後に停止します。The test stops after 10 seconds.

  4. メソッドのコードを修正します。Fix the method code:

    
    public double SquareRoot(double input)  
    {  
      if (input <= 0.0)   
      {  
        throw new ArgumentOutOfRangeException();  
      }   
    ...  
    
  5. テスト エクスプローラーで [すべて実行]をクリックします。In Test Explorer, choose Run All.

    すべてのテストに合格します。All the tests pass.

テストを変更せずにリファクタリングするRefactor without changing tests

  1. テストを変更せずに、コードを簡略化します。Simplify the code, but do not change the tests.

    ヒント

    リファクタリング とは、コードのパフォーマンスを高めたり、コードをわかりやすくすることを目的として行う変更です。A refactoring is a change that is intended to make the code perform better or to make the code easier to understand. コードの動作を変更することを意図しないため、テストは変更されません。It is not intended to alter the behavior of the code, and therefore the tests are not changed.

    リファクタリングの手順は、機能を拡張する手順とは別に実行することをお勧めします。We recommend that you perform refactoring steps separately from steps that extend functionality. テストを変更しないことで、リファクタリング時に誤ってバグが生じる状況を回避できます。Keeping the tests unchanged gives you confidence that you have not accidentally introduced bugs while refactoring.

    public class Rooter  
    {  
      public double SquareRoot(double input)  
      {  
        if (input <= 0.0)   
        {  
          throw new ArgumentOutOfRangeException();  
        }  
        double result = input;  
        double previousResult = -input;  
        while (Math.Abs(previousResult - result) > result / 1000)  
        {  
          previousResult = result;  
          result = (result + input / result) / 2;  
          //was: result = result - (result * result - input) / (2*result);  
        }  
        return result;  
      }  
    }  
    
  2. [すべて実行]をクリックします。Choose Run All.

    今回もすべてのテストに合格します。All the tests still pass.

    3 つのテストが成功したことを示す単体テスト エクスプローラー。Unit Test Explorer showing 3 passed tests.