快速入门:通过测试资源管理器进行由测试驱动的开发

我们建议您创建单元测试,以确保代码通过开发的许多增量的步骤可以正常工作。 有几种可用于编写单元测试,包括一些由第三方开发的框架。 一些测试框架被专业服务在不同的语言或平台中进行测试。 测试资源管理器在任何这些框架中的单元测试提供一个单一的界面。 适配器可用于最常用的框架中,并且您可以编写自己的其他框架的适配器。

测试资源管理器取代了早期版本中的 Visual Studio 单元测试程序。 其好处包括:

  • 运行。NET 中,非托管,数据库和其他类型的测试使用一个单一的界面。

  • 使用单元测试框架的您的选择,例如NUnit或 MSTest 框架。

  • 在一个窗口中看到您通常需要的所有信息。 更多详细信息可在属性窗口。

使用测试资源管理器

显示“全部运行”按钮的单元测试资源管理器

通过使用资源管理器中测试运行单元测试

  1. 创建使用您选择的测试框架的单元测试。

    例如,创建一个测试使用的 MSTest 框架:

    1. 创建测试项目。

      新项目 对话框框中,展开 Visual BasicVisual C#,或 Visual C++,然后选择 测试

      选择单元测试项目

    2. 编写每个单元测试的方法。 前缀与每个测试方法[TestMethod]属性。

  2. 在菜单栏中,选择测试运行单元测试的所有测试

    在解决方案生成并运行测试。

    测试资源管理器中打开,并显示结果的摘要。

若要测试的完整列表,请参阅: 选择全部显示在任何类别中。

若要返回到摘要,请选择开始视图。

若要测试结果的详细信息,请参阅: 测试资源管理器中选择的测试。 在详细信息窗格中显示的详细信息,如异常消息。 您还可以查看更多详细信息,请在属性窗口中。

若要导航到某个测试的代码: 双击测试资源管理器中的测试,或选择打开测试在快捷菜单上。

若要调试测试: 打开的一个或多个测试,在快捷菜单,然后选择调试选中的测试

重要

显示结果的最新运行。彩色的结果栏显示了仅用于测试运行的结果。例如,如果您运行多个测试,其中的一部分发生故障,并运行测试仅成功,则结果栏将显示全部呈绿色亮起。

备注

如果不出现任何测试,请确保已安装了一个适配器来连接到您正在使用的测试框架的测试资源管理器。有关详细信息,请参阅和测试资源管理器使用不同测试框架。

演练: 使用单元测试开发方法

本演练演示如何在 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,然后在快捷菜单上选择生成方法存根 (stub)

  5. 运行单元测试。

    • 测试 菜单中,选择 运行单元测试的所有测试

      解决方案生成并运行。

      测试资源管理器中打开,并显示结果。

      该测试将显示在下失败测试

  6. 选择测试的名称。

    测试资源管理器的下半部分显示测试的详细信息。

  7. 选择的项目下堆栈跟踪查看失败测试的位置。

显示失败的测试的单元测试资源管理器。

现在,您已创建一个测试,以便测试通过,您将修改存根 (stub)。

每次更改后,请传递的所有测试

  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 重构是旨在使代码更好地执行,或使代码更易于理解的更改。它不是改变准则 》 的行为,因此测试不会更改。

    我们建议您执行重构步骤分别从扩展功能的步骤。保持不变的测试使您可以放心您不会意外地引入了 bug 时重构。

      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 个通过的测试的单元测试资源管理器。