クイック スタート: テスト エクスプローラーによるテスト駆動開発

インクリメンタル開発の多くの手順を正常にコードするために単体テストを作成することをお勧めします。いくつかサード パーティによって開発されたなどの単体テストを記述することができますいくつかのフレームワークです。いくつかのテストのフレームワークは、さまざまな言語やプラットフォームのテストに特化します。エクスプ ローラーのテストは単体テスト フレームワークはこれらのいずれかを 1 つのインターフェイスを提供します。アダプターは、最も一般的に使用されるフレームワークを利用し、独自のアダプターを他のフレームワークを作成できます。

エクスプ ローラーのテストには、Visual Studio の以前のバージョンで見つかった単体テスト windows より優先されます。その利点は次のとおりです。

  • 実行します。NET では、アンマネージ、データベースおよびその他の種類の 1 つのインターフェイスを使用してテストします。

  • などの任意の単体テスト フレームワークの使用NUnitまたは MSTest フレームワーク。

  • 1 つのウィンドウでは、通常、必要なすべての情報を参照してください。詳細についてである、 のプロパティウィンドウ。

テストのエクスプ ローラーを使用してください。

単体テストのエクスプ ローラーを使用してテストを実行するには

  1. 独自のテスト フレームワークを使用して単体テストを作成します。

    たとえば、テストを作成するのには、MSTest フレームワーク使用します。

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

      新しいプロジェクト ダイアログ ボックスで、を展開 Visual BasicVisual C# で、または Visual C、し [ テスト

      選択単体テスト プロジェクト

    2. 各単体テストはメソッドとして記述します。プレフィックスの各テスト メソッドは、 [TestMethod]属性。

  2. メニュー バーを選択テスト単体テストの実行のすべてのテスト

    ソリューションをビルドし、テストを実行します。

    テストのエクスプ ローラーを開き、結果の概要が表示されます。

テストの完全な一覧を表示するのには: 選択すべて表示で任意のカテゴリ。

概要に戻るには、選択、 ホームビュー。

テスト結果の詳細を表示するのには: テストのエクスプ ローラーで、テストを選択します。例外メッセージなどの詳細は、詳細ペインで表示されます。詳細には、[プロパティ] ウィンドウを表示できます。

テストのコードに移動するのには: 、エクスプ ローラーのテストでテストをダブルクリックするか、または選択テストを開く 、ショートカット メニューの。

テストをデバッグするのには: テストでは、1 つ以上のショートカット メニューを開き、選択選択されたテストをデバッグ

重要 : 重要

表示される結果は、最新の実行されます。色付きの結果、実行するテストの結果だけが表示されます。たとえば、いくつかのテストを実行し、それらのいくつかは失敗し、成功したテストのみを実行する場合は、[結果バーすべて緑色表示されます。

[!メモ]

テストが何も表示されない場合は、エクスプ ローラーのテストを使用しているテスト フレームワークに接続するのには、アダプターがインストールされていることを確認します。詳細についてを参照してください別のテスト フレームワークを使用してテストのエクスプ ローラーで。

チュートリアル: 単体テストを使用する方法を開発するのには

このチュートリアルでは、C# では、Microsoft の単体テスト フレームワークを使用してテスト メソッドを作成する方法について説明します。簡単に、他の言語では、NUnit などの他のテスト フレームワークを使用して変更できます。詳細についてを参照してくださいを使用して別のテスト フレームワーク。

テスト メソッドを作成

  1. Visual c# クラス ライブラリ プロジェクトを作成します。このプロジェクトは、私たちを提供するコードが含まれます。この例では、名前 MyMath。

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

    • 新しいプロジェクト ダイアログ、選択 Visual C# でテスト し [ 単体テスト プロジェクト

      新しいコードとテスト プロジェクト

  3. テストの基本的なメソッドを記述します。特定の入力の取得、結果を確認します。

      [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. テスト メソッドを生成します。

    1. 上にカーソルを置きますRooter、し、ショートカット メニューの [ 生成新型

    2. 生成の新しいタイプ ダイアログ ボックスで、セット プロジェクトをクラス ライブラリ プロジェクト。この例では、 MyMath。

    3. 上にカーソルを置きますSquareRoot、し、ショートカット メニューの [ 生成メソッド スタブ

  5. 単体テストを実行します。

    • テスト メニューの [を選択 単体テストの実行のすべてのテスト

      ソリューションをビルドおよび実行します。

      テストのエクスプ ローラーを開き、結果が表示されます。

      テストの下に表示されるテストの失敗

  6. テストの名前を選択します。

    テストの詳細はエクスプ ローラーのテストの下の部分に表示されます。

  7. 下のアイテムを選択するスタック トレースするには、テストが失敗した場所を参照してください。

テストの失敗を示す単体テスト エクスプローラー。

この時点で、テストし、テストに合格するように変更されますスタブを作成しました。

後のすべての変更を渡すすべてのテストを行う

  1. MyMath\Rooter.cs、コードを改善SquareRoot。

     public double SquareRoot(double input)
      {
        return input / 2;
      }
    
  2. テストのエクスプ ローラーで、選択するを実行すべて

    コードをビルドし、テストを実行します。

    テストに合格します。

    テストの成功を示す単体テスト エクスプローラー。

入力値の範囲を拡張するためのテストを追加します。

  1. いずれの場合でも、コードの動作を確実に向上させるには、広範な入力値を試すテストを追加します。

    ヒントヒント

    既存のテストを渡しますを変更しないでください。代わりに、新しいテストを追加します。のみ、ユーザーの要件を変更する場合は、既存のテストを変更します。このポリシーは、コードを拡張する中で、既存の機能が失われないことを確認できます。

    テスト クラスでは、入力値の範囲をしようと、次のテストを追加します。

      [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. テストのエクスプ ローラーで、選択するを実行すべて

    最初のテストを通過するが、新しいテストが失敗します。

    失敗箇所を検索するには、失敗したテストを選択し、エクスプ ローラーのテストの下の部分では、一番上の項目の選択、 スタック トレース

  3. 何が間違っている可能性がありますを表示するには、テスト対象のメソッドを確認します。MyMath.Rooter クラスに、コードを書き換えます。

      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. テストのエクスプ ローラーで、選択するを実行すべて

    これで両方のテストを渡します。

テストの例外的なケースを追加します。

  1. テスト入力の負の値を追加します。

           [TestMethod]
            public void RooterTestNegativeInputx()
            {
                Rooter rooter = new Rooter();
                try
                {
                    rooter.SquareRoot(-10);
                }
                catch (ArgumentOutOfRangeException e)
                {
                    return;
                }
                Assert.Fail();
            }
    
  2. テストのエクスプ ローラーで、選択するを実行すべて

    メソッドは、ループをテストし、手動でキャンセルする必要があります。

  3. 選択キャンセル

    テストは 10 秒後に停止します。

  4. メソッドのコードを修正します。

      public double SquareRoot(double input)
      {
        if (input <= 0.0) 
        {
          throw new ArgumentOutOfRangeException();
        } 
      ...
    
  5. テストのエクスプ ローラーで、選択するを実行すべて

    すべてのテストを渡します。

リファクタリングのテストを変更することがなく

  1. コードの簡略化が、テストを変更しないでください。

    ヒントヒント

    A リファクタリングより効果的に実行するコードを作成するか、コードをわかりやすくするために対象としていますが変更されます。それはコードの動作を変更するものではありません、したがって、テストは変更されません。

    リファクタリングの手順とは別に機能を拡張する手順を実行することをお勧めします。変更のテストを保持することで、誤ってリファクタリング中にバグがないことを確信できます。

      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. 選択実行

    まだ、すべてのテストを渡します。

    3 つのテストが成功したことを示す単体テスト エクスプローラー。