Visual Studio 2015 C++ 单元测试方法
确定测试的方法
测试产品代码有多种方式,具体视其是否显示要测试的接口而定。 选择以下方式之一:
- 单元测试将仅使用从受测试代码导出的函数
- 添加单独的测试项目。 在测试项目中,添加对所测试项目的引用
- 受测试的代码生成为一个 .exe 文件
- 添加单独的测试项目。 将其与输出对象文件关联起来
- 单元测试必须使用私有函数和数据,并且所测试代码可以生成为静态库
- 更改所测试的项目,以将其编译为 .lib 文件。 添加引用所测试项目的单独测试项目
- 此方法的好处是,允许测试使用私有成员,但测试仍保留在单独的项目中。
- 然而,对于必须有动态链接库 (.dll) 的某些应用程序,可能不适用
- 单元测试必须使用私有函数和数据,并且所测试代码可以生成为动态链接库 (DLL)
- 在产品代码所在项目中添加单元测试
一般常用的是添加单独的测试项目,下面详细介绍添加单元测试的步骤。
创建测试项目
在当前解决方案内添加测试项目
这种方式适用于小型项目,只需要在当前解决方案中添加单元测试项目即可。
- 对于已经存在的项目,在“解决方案资源管理器”窗口中,右键解决方案(在项目的上一级)
- 在弹出的选择窗口中依次选择“添加”、“新建项目”
- 在添加新项目窗口中,依次选择“Visual C++”、“测试”、“本机单元测试项目”,修改项目名称,然后点击确定
[](http://uusama.com/wp-content/
创建完测试项目之后,还需要关联测试与对象或库文件
。
关联测试与对象或库文件
如果所测试代码不导出要测试的函数,可以将输出的 .obj 或 .lib 文件添加到测试项目的依赖项中。
- 如果已经有测试项目,可以忽略这一步。在“文件”菜单中,依次选择“新建”、“项目”、“Visual C++”、“测试”、“C++ 单元测试项目”,创建 C++ 测试项目。
- 在“解决方案资源管理器”中,从测试项目的快捷菜单上选择“属性”。 此时将打开项目属性窗口。
- 依次选择“配置属性”、“链接器”、“输入”、“附加依赖项”。
选择“编辑”,并添加 .obj 或 .lib 文件的名称。 请不要使用全路径名。如:../project_name/Debug/String.obj - 依次选择“配置属性”、“链接器”、“常规”、“附加库目录”。
选择“编辑”,并添加 .obj 或 .lib 文件的目录路径。 该路径一般位于所测试项目的生成文件夹中。 - 依次选择“配置属性”、“VC++ 目录”、“包含目录”。
选择“编辑”,然后添加所测试项目的标头目录。
引用从测试项目导出的函数
如果所测试项目将导出你要测试的函数,则可添加对测试项目中该代码项目的引用
- 在“文件”菜单中,依次选择“新建”、“项目”、“Visual C++”、“测试”、“C++ 单元测试项目”。创建 C++ 测试项目
- 在“解决方案资源管理器”中,从测试项目的快捷菜单上选择“引用”。 此时将打开项目属性窗口
- 依次选择“通用属性”、“框架和引用”,然后选择“添加新引用”按钮
- 选择“项目”,然后选择要测试的项目。选择“添加”按钮。
- 在测试项目的属性中,将所测试项目的位置添加到“包含目录”中。
依次选择“配置属性”、“VC++ 目录”、“包含目录”。
选择“编辑”,然后添加所测试项目的标头目录。
在同一项目中添加单元测试
另外还可以不通过创建单元测试项目,而是在当前项目中添加单元测试。首先修改产品代码项目属性,以包含单元测试所需的标头和库文件。
- 在“解决方案资源管理器”中,从所测试项目的快捷菜单上选择“属性”。 此时将打开项目属性窗口。
- 依次选择“配置属性”、“VC++ 目录”。
- 编辑“包含目录”和“库目录”:
- 包含目录 : (VCInstallDir)UnitTest\include;(IncludePath
- 库目录 : (VCInstallDir)UnitTest\lib;(LibraryPath)
然后添加 C++ 单元测试文件,在“解决方案资源管理器”中,从项目的快捷菜单依次选择“添加”、“新建项”,然后选择“C++ 单元测试”。
创建单元测试文件
可以在创建的单元测试项目中新建测试文件,如 StringTest.cpp,需要注意在测试文件中只能包含头文件,否则会出错,比如下面只能包含StringCode.h
,不能包含StringCode.cpp
,记得引入头文件。
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../LeetCode/StringCode.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace LeetCodeTest
{
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(TestMethod1)
{
Assert::AreEqual(1, 1);
}
};
}
- 每个测试都使用 TEST_METHOD(YourTestName){…}来定义,你不必编写常规函数签名。 签名由宏 TEST_METHOD 来创建。 该宏将生成一个返回 void 的实例函数。 它还将生成返回有关测试方法的信息的静态函数。 此信息允许测试资源管理器查找方法。
- 使用 TEST_CLASS(YourClassName){…}将测试方法分组为各个类。当测试运行时,将为每个测试类创建一个实例。 测试方法以未指定的顺序进行调用。 可以定义在每个模块、类或方法之前和之后调用的特殊方法。
在“测试” 菜单中,选择“运行” ->“全部测试” ,将生成并运行测试。此时将显示测试资源管理器。测试显示在“通过的测试” 下方。