如何:创建和运行单元测试

通过单元测试,开发人员和测试人员可以快速地检查 C#、Visual Basic .NET 和 C++ 项目中各个类的方法中是否有逻辑错误。 单元测试可以创建一次,并在每次更改源代码时运行,以确保不引入 Bug。

本主题介绍如何使用 Microsoft Visual Studio 2010 单元测试工具根据现有代码自动生成单元测试的主干、添加验证填充这个主干、创建测试类别、创建测试列表、运行测试和读取代码覆盖率结果。

有关单元测试各部分的说明,请参见单元测试分析

单元测试示例

本示例取材于演练:创建并运行单元测试

下图显示了**“创建单元测试”对话框。 右击包含方法的代码文件,然后单击“创建单元测试”后,将显示这个对话框。 对于您在该对话框的“类型”**列表中选中的所有方法,系统都会为其生成单元测试。

下图显示,在此示例中将为 Credit 和 Debit 方法生成单元测试。

“创建单元测试”对话框

生成单元测试后,将创建代码文件,并在解决方案资源管理器中显示更改。

下图显示了创建单元测试的结果。

图片状态所需的标题所有者

  1. 系统将为在“创建单元测试”对话框中选择的每个方法分别创建一个单元测试。 在此示例中,我们为 Credit 和 Debit 方法生成了单元测试。

  2. 所生成的每个单元测试都有空变量和占位符 Assert 语句。 默认的占位符 Assert 语句通常是 Assert.Inconclusive 语句。

  3. 若要使测试有意义,必须初始化变量,并将占位符替换为适当的 Assert 语句。 在此示例中,我们保留了 Credit 单元测试在其生成时的状态,但初始化了变量,并替换了 Debit 测试方法中的 Assert 语句。

  4. 当您首次生成单元测试时,将在您的解决方案中创建一个测试项目。

  5. 对于要测试的每个类,系统将在该测试项目中分别创建一个单独的单元测试文件。 在此示例中,我们正在测试的两个方法属于同一个类。 因此,只有一个单元测试文件 BankAccountTest.cs。

  6. 运行测试后,结果将显示在**“测试结果”**窗口中。

创建单元测试

创建单元测试分为两个阶段。

第一个阶段是生成单元测试文件,该文件包含正在测试的代码中每个方法所对应的测试方法的主干版本。 生成的每个主干测试方法均有空变量和占位符 Assert 语句。

第二个阶段是初始化变量,并将占位符 Assert 语句替换为适当的语句。

生成单元测试的主干

使用**“创建单元测试”**对话框为正进行测试的代码中的任意或所有方法生成单元测试。

提示

一般来说,虽然标有 private、internal 和 friend 等特性的方法在这些方法的类之外不可见,但 Microsoft Visual Studio 2010 工具允许单元测试访问这些方法。 有关这种情况的工作原理的更多信息,请参见 private、internal 和 friend 方法的单元测试

生成单元测试的主干

  1. 在**“Visual Studio 代码编辑器”**窗口中打开要测试的代码。

  2. (仅限 ASP.NET 服务)如果要测试 ASP.NET Web 服务,请确保项目包含 .aspx 页。 如果为不含 .aspx 页的项目中的 Web 服务创建了单元测试,则在尝试运行该测试时将收到错误。 有关更多信息,请参见ASP.NET Web 服务的单元测试

  3. 右击要测试的命名空间、类或方法,然后单击**“创建单元测试”**。

  4. 在**“创建单元测试”**对话框中,选中要添加到单元测试文件的所有方法的复选框。

  5. (可选)单击**“设置”**,更改要创建的单元测试的默认设置。 这些是 Visual Studio 设置,适用于您创建的任何单元测试,直到再次更改设置为止。

    • **命名设置:**通过这些选项可以自定义生成单元测试时如何命名测试文件、测试类和测试方法。

    • **默认情况下将所有测试结果标记为没有结论:**选中该复选框可为每个测试方法提供 Assert.Inconclusive() 语句作为占位符 Assert。 清除该复选框可消除占位符 Assert。

    • **启用文档注释:**选中此复选框可为每个测试方法提供占位符注释。 清除该复选框可消除占位符注释。

    • **允许 InternalsVisibleTo 特性:**选中该复选框可使标为 Friend 或 Internal 的方法被视为公共方法(推荐)。 清除该复选框则需要使用专用访问器测试这些方法。 有关专用访问器的更多信息,请参见private、internal 和 friend 方法的单元测试

  6. (可选)若要为没有其源代码的程序集中的方法添加测试,请单击**“添加程序集”**。 有关更多信息,请参见如何:在没有源代码的情况下创建单元测试

  7. 在**“输出项目”**框中,执行以下操作之一:

    • 若要创建新测试项目,请为该新项目选择一种语言,然后单击**“确定”。 此时将出现“新建测试项目”对话框。 可以命名该项目或接受默认名称,然后单击“创建”**。

    • 若要将在**“创建单元测试”对话框中选择的方法附加到现有测试项目中的单元测试文件,请在下拉列表中选择该项目,然后单击“确定”**。

向单元测试添加验证

生成的单元测试文件中的每个测试方法都有空变量和占位符 Assert 语句。 您可以运行此类测试,但由于没有真实数据,所以无法判断该方法的行为是否与预期的相符。 若要使测试有意义,必须初始化变量,并将占位符 Assert 语句替换为适于该方法的语句,该语句通常是 Assert.AreEqual 语句。

向单元测试添加验证

  1. 打开单元测试文件,然后找到要初始化其变量的单元测试。

  2. 找到单元测试中的变量赋值。

    在新生成的测试中,将使用“TODO”语句标记变量赋值部分,旨在提醒您需要自定义这些赋值语句。 例如,以下便是需要编辑的一个典型的赋值语句:

    string target.owner = null; // TODO: Initialize to an appropriate value

  3. 为每个变量赋给相应的值。 有关给相应变量赋值的示例,请参见演练:创建并运行单元测试中的“运行和编辑单元测试”过程。

    提示

    通过创建数据驱动的单元测试,可以使用一系列不同的值来运行单元测试。 数据驱动的单元测试是为数据源中的每一行重复运行的一种单元测试。 有关更多信息,请参见如何:创建数据驱动的单元测试

  4. 查找并编辑单元测试中的 Assert 语句。 有关可用 Assert 语句的更多信息,请参见使用 Assert 类

  5. (可选)使用 Microsoft.VisualStudio.TestTools.UnitTesting 命名空间的 [TestInitialize()] 和 [TestCleanup()] 方法为单元测试添加设置和清理代码。 生成单元测试时,将向单元测试文件添加“附加测试特性”一节。 展开此节可显示注释掉的可用于包括初始化和清理的方法。

(可选)创建测试类别

通过使用测试类别将测试分类,可以管理自动测试。 有关更多信息,请参见定义对测试进行分组的测试类别

提示

测试列表上方推荐了测试类别。 通过测试类别,可以根据为各组测试分配的类别运行各组测试,无须保留测试列表。

创建新的测试类别

  1. 打开**“测试视图”**窗口。

  2. 选择一个测试。

  3. 在属性窗格中,单击**“测试类别”**,然后单击最右侧列中的省略号 (…)。

  4. 在**“测试类别”窗口的“添加新的类别”**框中,键入新测试类别的名称。

  5. 单击**“添加”,然后单击“确定”**。

    新的测试类别将分配给您的测试,而且可由其他测试通过它们的属性使用。

(可选)创建测试列表

测试列表是收集单元测试并将其划分为逻辑组的一种方法。 向测试列表添加单元测试的主要优点是可以从多个单元测试文件运行测试,可以运行这些文件作为生成的一部分,而且可以使用列表实施签入策略。 有关测试列表的更多信息,请参见定义对测试进行分组的测试列表

提示

测试列表上方推荐了测试类别。 通过测试类别,可以根据为各组测试分配的类别运行各组测试,无须保留测试列表。

创建测试列表

  1. 在**“测试”菜单上,单击“创建新测试列表”**。

  2. 在**“创建新测试列表”对话框中,为列表键入名称、添加说明、选择要放置测试列表的位置,然后单击“确定”**。

  3. 若要显示可用测试,请在**“测试列表编辑器”窗口中单击“所有已加载的测试”**。

  4. 将要添加的每个单元测试从主窗口拖至测试列表上。

运行单元测试

创建了单元测试后,即可随时运行这些测试。 以下过程是运行单元测试的方法之一,但有关备用方法(如使用快捷键或命令行)的更多信息,请参见如何:从 Microsoft Visual Studio 运行自动测试

运行单元测试

  1. 在**“测试”菜单上,指向“窗口”,然后单击“测试视图”**。

  2. (可选)如果要收集代码覆盖率信息,请执行以下操作:

    1. 在**“测试”菜单上,指向“编辑测试设置”**,然后单击当前测试运行的测试设置。

    2. 在**“测试设置”对话框中,单击“数据和诊断”**。

    3. 在**“角色”**下,选择运行测试要使用的角色。

    4. 选中**“代码覆盖率”,然后单击“配置”**。

    5. 选中一个或多个复选框,以选择收集其代码覆盖率信息的项。

    6. 在**“代码覆盖率详细信息”对话框中,单击“确定”**。

    7. 在**“测试设置”对话框中,单击“应用”,再单击“关闭”**。

  3. 在**“测试视图”**窗口中,选择一个或多个测试。 若要选择多个测试,请按住 Ctrl 键单击相应测试。

  4. 单击**“测试视图”窗口工具栏上的“运行选定内容”按钮。 此时测试将运行,并打开“测试结果”**窗口。

  5. (可选)若要查看有关某个测试的详细信息,请在**“测试结果”**窗口中右击该测试,然后单击“查看测试结果详细信息”。

  6. (可选)若要查找单元测试文件中包含某个错误的区域,请在详细信息窗口中的**“错误堆栈跟踪”**下,单击该错误的链接。

有关了解测试结果的更多信息,请参见查看测试结果

(可选)查看代码覆盖率

如果选择了收集代码覆盖率信息,则可以打开**“代码覆盖率”**窗口来查看您的单元测试覆盖了所测试的代码中百分之多少的方法。 有关如何检查已运行测试的代码覆盖率的更多信息,以及有关如何管理代码覆盖率结果的更多信息,请参见代码覆盖率数据概述

查看单元测试的代码覆盖率

  1. 在**“测试结果”窗口中,单击工具栏上的“显示代码覆盖率结果”**。 您可能必须放大此窗口才能看到该按钮。

  2. 随即打开**“代码覆盖率结果”**窗口。

    此窗口显示已对方法进行了何种程度的测试。

请参见

任务

如何:使用负载测试编辑器向负载测试方案中添加 Web 性能、单元和编码的 UI 测试

如何:使用负载测试编辑器从负载测试方案中移除 Web 性能测试、单元和编码的 UI 测试

概念

单元测试分析

单元测试和 C++

泛型方法的单元测试

ASP.NET Web 服务的单元测试