用测试资源管理器对现有的 C++ 应用程序进行单元测试

我们建议在更改现有应用程序之前,请确保单元测试中已覆盖其各种情况。如此,你便有信心保证你的更改不会引入 bug。如果应用程序尚没有单元测试,可使用本主题演示的方法自己添加。本主题介绍如何为现有 Visual C++ 代码添加单元测试 - 从确定测试代码的方法,直到测试的创建、编写和最终运行。

确定测试代码的方法

打开现有 C++ 项目,并进行检查以确定添加单元测试的方法。你可能需要使用一些建模工具,来帮助你发现代码中的依赖关系,并帮助你理解各部分的交互方式。有关详细信息,请参阅可视化代码

我建议你将更改分离成小型任务。在执行每个小型更改之前,为保持不变的行为方面编写单元测试。在你进行更改之后,这些测试仍会通过。例如,你计划更改一个排序函数,以便按姓氏对人员列表排序,来代替按名字排序,那么你可以编写单元测试来验证输入的所有姓名是否都显示在输出中。在你进行此项更改后,可能需要为这种新行为添加新的单元测试。

如果可行,则你的许多或全部单元测试应仅使用导出的函数。但是,如果你要更改整个应用程序的一小部分,则可能希望使用不导出的函数。例如,你可能需要调用内部函数的测试,或者设置和获取内部变量值的测试。

测试产品代码有多种方式,具体视其是否显示要测试的接口而定。选择以下方式之一:

  • 单位测试将仅使用从受测试代码导出的函数:
    添加单独的测试项目。在测试项目中,添加对所测试项目的引用。
转到过程引用从测试项目导出的函数。
  • 受测试的代码生成为一个 .exe 文件:
    添加单独的测试项目。将其与输出对象文件关联起来。

    转到过程将测试链接到对象或库文件。

  • 单元测试必须使用私有函数和数据,并且所测试代码可以生成为静态库:
    更改所测试的项目,以将其编译为 .lib 文件。添加引用所测试项目的单独测试项目。

    此方法的好处是,允许测试使用私有成员,但测试仍保留在单独的项目中。然而,对于必须有动态链接库 (.dll) 的某些应用程序,可能不适用。

    转到将所测试代码更改为静态库过程。

  • 单元测试必须使用私有函数和数据,并且所测试代码可以生成为动态链接库 (DLL):
    在产品代码所在项目中添加单元测试。

    转到在同一项目中添加单元测试过程。

创建测试

将所测试代码更改为静态库

  • 如果测试必须使用所测试项目不导出的成员,并且所测试项目将生成为动态库,请考虑将其转换为静态库。

    1. 在“解决方案资源管理器”中,从所测试项目的快捷菜单上选择**“属性”**。此时将打开项目属性窗口。

    2. 依次选择**“配置属性”“常规”**。

    3. 将**“配置类型”设置为“静态库 (.lib)”**。

继续执行过程将测试链接到对象或库文件。

引用从测试项目导出的函数

  • 如果所测试项目将导出你要测试的函数,则可添加对测试项目中该代码项目的引用。

    1. 创建 C++ 测试项目。

      • 在**“文件”菜单中,依次选择“新建”“项目”“Visual C++”“测试”“C++ 单元测试项目”**。
    2. 在“解决方案资源管理器”中,从测试项目的快捷菜单上选择**“引用”**。此时将打开项目属性窗口。

    3. 依次选择**“通用属性”“框架和引用”,然后选择“添加新引用”**按钮。

    4. 选择**“项目”**,然后选择要测试的项目。

      选择**“添加”**按钮。

    5. 在测试项目的属性中,将所测试项目的位置添加到“包含目录”中。

      依次选择**“配置属性”“VC++ 目录”“包含目录”**。

      选择**“编辑”**,然后添加所测试项目的标头目录。

转到编写单元测试。

关联测试与对象或库文件

  • 如果所测试代码不导出要测试的函数,可以将输出的 .obj.lib 文件添加到测试项目的依赖项中。

    1. 创建 C++ 测试项目。

      • 在**“文件”菜单中,依次选择“新建”“项目”“Visual C++”“测试”“C++ 单元测试项目”**。
    2. 在“解决方案资源管理器”中,从测试项目的快捷菜单上选择**“属性”**。此时将打开项目属性窗口。

    3. 依次选择**“配置属性”“链接器”“输入”“附加依赖项”**。

      选择**“编辑”**,并添加 .obj.lib 文件的名称。请不要使用全路径名。

    4. 依次选择**“配置属性”“链接器”“常规”“附加库目录”**。

      选择**“编辑”**,并添加 .obj.lib 文件的目录路径。该路径一般位于所测试项目的生成文件夹中。

    5. 依次选择**“配置属性”“VC++ 目录”“包含目录”**。

      选择**“编辑”**,然后添加所测试项目的标头目录。

转到编写单元测试。

在同一项目中添加单元测试

  1. 修改产品代码项目属性,以包含单元测试所需的标头和库文件。

    1. 在“解决方案资源管理器”中,从所测试项目的快捷菜单上选择“属性”。此时将打开项目属性窗口。

    2. 依次选择**“配置属性”“VC++ 目录”**。

    3. 编辑“包含目录”和“库目录”:

      包含目录

      $(VCInstallDir)UnitTest\include;$(IncludePath)

      库目录

      $(VCInstallDir)UnitTest\lib;$(LibraryPath)

  2. 添加 C++ 单元测试文件:

    • 在“解决方案资源管理器”中,从项目的快捷菜单依次选择**“添加”“新建项”,然后选择“C++ 单元测试”**。

转到编写单元测试。

编写单元测试

  1. 在每个单元测试代码文件中,为所测试项目的标头添加 #include 语句。

  2. 向单元测试代码文件添加测试类和方法。例如:

    #include "stdafx.h"
    #include "CppUnitTest.h"
    #include "MyProjectUnderTest.h"
    using namespace Microsoft::VisualStudio::CppUnitTestFramework;
    namespace MyTest
    {
      TEST_CLASS(MyTests)
      {
      public:
          TEST_METHOD(MyTestMethod)
          {
              Assert::AreEqual(MyProject::Multiply(2,3), 6);
          }
      };
    }
    

有关详细信息,请参阅用测试资源管理器对本机代码进行单元测试

运行测试

  1. 在**“查看”菜单中,依次选择“其他窗口”“测试资源管理器”**。

  2. 在“测试资源管理器”中,选择**“全部运行”**。

有关详细信息,请参阅快速入门:通过测试资源管理器进行由测试驱动的开发