单元测试概述

更新:2007 年 11 月

单元测试是一种编程测试,这些测试既可以使用 Visual C# 或 Visual Basic 编写,也可以使用 Visual C++ 编写并用 /clr:safe 选项进行编译。

说明:

有关如何对 C++ 成品代码使用单元测试以及如何使用用 C++ 编写的单元测试的详细信息,请参见 单元测试和 C++

单元测试用于通过直接调用某个类的方法(传递相应参数)来执行其他源代码。因此,如果包括 Assert 语句,它们可以根据所期望的值来测试实际生成的值。单元测试方法位于测试类中,测试类则存储在源代码文件中。

可以使用能够创建测试的初始源代码的代码生成功能来创建单元测试,也可以完全手动编写测试。无论使用何种方式,测试类和所有测试方法都用编程属性加以标识。

用 [TestClass()] 属性标记每个测试类。每个单元测试都是一个使用 [TestMethod()] 属性标记的测试方法。这些属性是在生成单元测试时自动分配的;如果是手动编写单元测试代码,则必须自行添加类和方法的属性。有关更多信息,请参见单元测试的结构

生成单元测试

可以使用通过 Visual Studio 工具窗口打开的一个对话框生成单元测试。每个单元测试都作为一个 C#、Visual Basic 或 Visual C++ 方法创建。它的代码和属性位于使用相同语言的测试项目的源文件中。新测试以您想要测试的特定代码作为目标。可以为单个方法生成一个单元测试,为选择的多个方法生成多个测试,或者为类或命名空间中的所有方法生成多个测试。

您可以从当前项目的源代码中生成单元测试。还可以从文件系统中的程序集生成单元测试,这在源代码不可用时很有用。

新生成的测试的代码将进行编译,但是要使它能够提供有用的测试结果,必须对它进行编辑。例如,可以对它进行编辑,以便为变量赋值和自定义 Assert 语句。生成的单元测试会包含一些 TODO 语句,用以指示必须进行编辑的代码行。

说明:

Team System 测试工具 在生成单元测试时将使用命名约定。例如,测试文件的名称由单词“Test”与包含待测试代码的文件的名称连接而成;例如“Class1Test.cs”。测试类和测试方法的名称也使用默认值生成。可以在“测试生成配置”对话框中更改这些默认值;要打开此对话框,请单击“单元测试生成”对话框上的“配置”。

有关更多信息,请参见如何:生成单元测试

创作单元测试

还可以手动创作单元测试,而不使用生成功能。这样做的最好办法是向测试项目中添加一个单元测试,这会创建一个带有存根 (Stub) 的测试方法,此方法不包含任何代码,但是应用了 [TestMethod()] 属性。若要完成这个测试,必须随后在其源文件中编辑测试,源文件位于解决方案的测试项目中。有关更多信息,请参见如何:创作单元测试单元测试的结构

单元测试框架

单元测试框架提供了许多附加 Assert 类和其他类,为您编写单元测试带来了极大的灵活性。有关更多信息,请参见 Microsoft.VisualStudio.TestTools.UnitTesting 下面有关单元测试框架的命名空间和类型的文档。

测试类继承

测试类是指使用 TestClass 属性标记的所有类。测试类现在可以继承其他测试类的成员。这意味着您可以在基本测试类中创建可重用的测试;派生的测试类可以继承基本测试类中的测试。此功能消除了重复的测试代码,使开发人员可以更灵活地对成品代码进行单元测试。

测试类不能继承位于其他程序集中的类。可以通过以下方法摆脱此限制:

  1. 在源代码文件中定义基本测试类,并将该文件添加到项目 A 中。

  2. 将同一个源代码文件添加到另一个项目(项目 B)中。若要执行此操作,请在“解决方案资源管理器”中右击该项目,单击“添加”,再单击“现有项”,然后使用“添加现有项”对话框选择该文件。

  3. 尽管项目 B 生成了不同的程序集,它仍然包括该基本测试类。项目 B 中的其他测试类可以继承该基本测试类。

继承示例

您的成品代码具有两个实现:一个使用 Microsoft SQL Server 后端,另一个使用 Oracle。两个实现必须以相同的方式工作。您可以创建一个抽象的测试类并将其命名为 DBTestSuite,其中包含标准的测试代码。然后可以创建两个类:SQLTestSuite 和 OracleTestSuite,它们都从 DBTestSuite 派生而来。派生的类只需要实现抽象的 Connect 方法。然后,一个测试类将连接到 Microsoft SQL Server,另一个连接到 Oracle。

接下来,可以创建一个 EmptySQLTestSuite 测试类,它从 SQLTestSuite 派生而来,用于测试空的 Microsoft SQL Server 数据库。若要提高性能,可以重写对测试空数据库无关紧要的特定测试方法。

如果使用测试类继承,“测试视图”窗口和“测试列表编辑器”将显示基类和子类中的测试方法。若要查看某个测试位于哪个类中,可以在“测试列表编辑器”中显示“类名”或“类的全名”列。有关更多信息,请参见如何:自定义测试视图

测试私有方法

使用单元测试不仅能够测试公共方法,还可以测试私有方法。与测试公共方法相同,针对私有方法的单元测试也可以在您从想要测试的代码生成测试时自动创建。有关更多信息,请参见如何:测试私有方法使用专用访问器

特殊类型的单元测试

下表列出了其他类型的单元测试:

单元测试类型

说明

数据驱动的单元测试

数据驱动的测试是一个单元测试,您将它配置为针对某个数据源的每一行重复调用它。每一行中的数据可以作为该测试的下一次运行的输入数据。有关更多信息,请参见数据驱动的单元测试概述

ASP.NET 单元测试

ASP.NET 单元测试用于在 ASP.NET 应用程序响应页面请求时执行其中的代码。ASP.NET 单元测试在接受测试的 ASP.NET 应用程序内运行。有关更多信息,请参见 ASP.NET 单元测试概述

智能设备单元测试

智能设备单元测试是在智能设备或仿真程序上的智能设备宿主进程下运行的单元测试。有关更多信息,请参见智能设备单元测试概述

Web 服务单元测试

有关 Web 服务单元测试的更多信息,请参见 测试 Web 服务

请参见

概念

单元测试的结构

单元测试和 C++

使用数据驱动的单元测试

其他资源

使用 ASP.NET 单元测试

使用智能设备单元测试

管理测试

运行测试

分析测试结果