单元测试分析

创建单元测试时,将向解决方案添加一些文件。 在本主题中,将使用单元测试示例来浏览常用文件。 该示例来自主题演练:创建并运行单元测试

单元测试文件的组成部分

当您创建单元测试时,系统会为您要测试的每个类创建一个单独的单元测试文件。 每个单元测试文件都为您要测试的每个方法包含一个测试方法。 在此示例中,我们要测试的两个方法属于同一个类。 因此,只有一个测试类文件:BankAccountTest.cs。

文件的顶部区域

下图显示了代码的前几行,包括对命名空间、TestClassAttribute 和 TestContext 类的引用。 如果您需要代码示例,请参见演练。

单元测试文件示例的顶部

  1. Microsoft.VisualStudio.TestTools.UnitTesting:当创建单元测试时,对 Microsoft.VisualStudio.TestTools.UnitTesting 命名空间的引用会添加到测试项目,该命名空间包括在单元测试文件顶部的 using 语句中。 该命名空间具有许多帮助您进行单元测试的类,包括:

    • 断言类,可用于在单元测试中验证条件

    • 初始化和清理特性,用于在单元测试运行之前和之后运行代码,以确保特定的开始和结束状态

    • ExpectedException 特性,用于验证在单元测试执行期间是否引发特定类型的异常

    • TestContext 类,用于存储向单元测试提供的信息(例如数据驱动的测试的数据连接)以及为 ASP.NET Web 服务运行单元测试所需的信息。

    有关更多信息,请参见 Microsoft.VisualStudio.TestTools.UnitTesting

  2. TestClassAttribute:当创建单元测试时,TestClassAttribute 包括在测试文件中,以指示此特定类可以包含用 [TestMethod()] 特性标记的方法。 如果没有 TestClassAttribute,则忽略这些测试方法。

    一个测试类可以从同一程序集中的另一个测试类继承方法。 这意味着您可以在基本测试类中创建测试方法,然后在派生的测试类中使用这些方法。

    有关更多信息,请参见 TestClassAttribute

  3. TestContext:当创建单元测试时,系统会为每个测试类包括一个称为 testContextInstance 的变量。 TestContext 类的属性存储有关当前测试的信息。 有关更多信息,请参见 TestContext

文件的底部区域

下图显示演练中生成的代码的后面部分,包括“附加测试特性”小节、TestMethod 特性和方法逻辑(包括 Assert 语句)。

单元测试文件示例的底部

  1. 附加测试特性:展开此节可显示注释掉的可用于包含初始化和清理代码的方法,方式是使用下列特性:

    1. [ClassInitialize()]   使用 ClassInitialize 可在运行类中的第一个测试前运行代码。

    2. [ClassCleanUp()]   使用 ClassCleanup 可在运行完类中的所有测试后运行代码。

    3. [TestInitialize()]   使用 TestInitialize 可在运行每个测试前运行代码。

    4. [TestCleanUp()]   使用 TestCleanup 可在运行完每个测试后运行代码。

      创建用 [ClassInitialize()] 或 [TestInitialize()] 特性标记的方法,以便准备将要在其中运行单元测试的环境的各个方面。 这样做的目的是建立一个已知状态以便于运行您的单元测试。 例如,您可以使用 [ClassInitialize()] 或 [TestInitialize()] 方法复制、更改或创建您的测试将要使用的某些数据文件。

      创建用 [ClassCleanup()] 或 [TestCleanUp{}] 特性标记的方法,以便在运行某个测试后将环境返回到已知状态。 这可能意味着删除文件夹中的文件或将数据库返回到已知状态。 这种情况的一个示例是:在对订单输入应用程序中使用的方法进行测试之后,将库存数据库重置为初始状态。

      提示

      建议您在 [TestCleanup()] 或 [ClassCleanup()] 方法(而不是终结器方法)中使用清理代码。 从终结器方法引发的异常不会被捕捉到,并且会导致无法预料的结果。

  2. TestMethodAttribute:当创建单元测试时,使用 [TestMethod()] 特性来标记每个单元测试方法。 如果该特性不存在,单元测试不会运行。 有关 TestMethod 特性的更多信息,请参见 TestMethodAttribute

  3. 测试方法逻辑(包括 Assert 语句):生成的每个单元测试都有空的变量和占位符 Assert 语句。 默认的占位符 Assert 语句通常是 Assert.Inconclusive 语句。 若要使测试有意义,必须初始化变量,并将占位符替换为适当的 Assert 语句。

    在此示例中,保留了 CreditTest 单元测试方法在其生成时的状态(包括其 TODO 语句)。 但是,初始化了变量并替换了 DebitTest 测试方法中的 Assert 语句。 TODO 语句的作用是提醒您可能需要初始化这些代码行。

    提示

    根据单元测试类型和正在测试的方法的本质,测试方法内容可能有所不同。

关于命名约定的注释:在生成单元测试时,Visual Studio 测试工具使用命名约定。 例如,单元测试文件的名称由单词“Test”与包含待测试代码的文件的名称连接而成;在示例中为“BankAccountTest.cs”。测试类和测试方法的名称也是使用默认值生成的。 可以在**“测试生成设置”对话框中更改这些默认值;要打开此对话框,请在“创建单元测试”对话框中单击“设置”**。

添加到解决方案中的项

本节包含在演练:创建并运行单元测试中生成的单元测试文件之外的其他文件。

提示

您创建单元测试时会默认生成哪些文件取决于测试项目设置。 若要更改这些设置,请单击工具,然后单击选项。 在“选项”对话框中,展开“测试工具”,然后单击“测试项目”

下图显示为示例项目创建单元测试后的解决方案资源管理器。

单元测试项目示例的解决方案资源管理器

  1. 解决方案项:解决方案项包含两个文件:

    • Local.testsettings:这些设置控制如何运行不收集诊断数据的本地测试。

    • Bank.vsmdi:此文件包含有关解决方案中存在的测试列表的信息,并填充“测试列表编辑器”窗口。

    • TraceAndTestImpact.testsettings:这些设置控制如何运行收集特定诊断数据集的本地测试。

  2. 测试项目:包含单元测试所需的其余文件。

  3. 测试项目属性:包含 AssemblyInfo.cs 文件,该文件为项目提供生成选项。

  4. 测试项目参考:包含运行单元测试所需的引用。 当从现有代码生成单元测试时,会包括所需的引用。 不过,您可以添加引用以自定义测试。

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

请参见

参考

Microsoft.VisualStudio.TestTools.UnitTesting

概念

针对现有代码创建并运行单元测试

单元测试和 C++

泛型方法的单元测试

ASP.NET Web 服务的单元测试

private、internal 和 friend 方法的单元测试