在Visual Studio中如何对C++项目进行单元测试(适用于Visual Studio 2017及以上的专业版和企业版)
Visual Studio 2017及以后的版本自带了以下几种测试框架,这里我以Microsoft Unit Testing Framework for C++为例,因为这个是默认安装的,后面几种都是需要在Visual Studio安装程序中钩选安装才能使用。
- Microsoft Unit Testing Framework for C++
- Google Test
- Boost.Test
- CTest
如果是Visual Studio 2015及以前的版本,可以在Visual Studio市场中下载扩展来达到同样的功能。
这里分两种情况:一种是有导出函数的(库),一种是没有导出函数的(exe)。
先演示一下如何对没有导出函数的C++工程进行测试。
使用Visual Studio 2019 创建一个C++ 控制台程序(ConsoleApp),增加一个类math,如下:
math.h
1 #pragma once 2 3 class math 4 { 5 public: 6 math(); 7 ~math(); 8 int multiply(int x, int y); 9 int sum(int x, int y); 10 };
math.cpp
1 #include "math.h" 2 math::math() 3 { 4 } 5 6 math::~math() 7 { 8 } 9 10 int math::multiply(int x, int y) 11 { 12 return x * y; 13 } 14 15 int math::sum(int x, int y) 16 { 17 return x + y; 18 }
然后再创建一个C++的测试工程ConsoleAppTests
创建完成后,需要执行以下步骤
1.添加ConsoleApp项目引用
2 将被测试的工程ConsoleApp链接进来。
打开属性->配置属性->链接器->输入->附加依赖项->$(SolutionDir)ConsoleApp\$(IntDir)*.obj
这个路径其实就是ConsoleApp的Debug目录,里面会有一些编译产生的文件,这里主要用到的就是obj文件。
3.添加头文件
我这里用的相对路径,也可以在属性->配置属性->VC++目录->包含目录这里,把ConsoleApp的目录包含进来,就可以直接使用头文件
1 #include "../ConsoleApp/math.h"
4. 编写测试代码
1 #include "pch.h" 2 #include "CppUnitTest.h" 3 #include "../ConsoleApp/math.h" 4 5 using namespace Microsoft::VisualStudio::CppUnitTestFramework; 6 7 namespace ConsoleAppTests 8 { 9 TEST_CLASS(ConsoleAppTests) 10 { 11 public: 12 13 TEST_METHOD(TestMath) 14 { 15 math ma; 16 auto result = ma.sum(2, 2); 17 18 Assert::IsTrue(result == 4); 19 } 20 }; 21 }
5.执行测试
可以通过菜单 测试->测试资源管理器打开测试资源管理器,然后执行测试或调试测试。
也可以点击测试函数上方的蓝色符号执行测试或调试
6. 查看测试结果
执行测试后,可以通过测试资源管理器查看测试是否通过
下面演示一下如何对有导出函数的C++工程进行测试。
首先,我们创建一个动态链接库工程Dll
增加下面两个文件用于测试
math.h
1 #pragma once 2 3 extern "C" __declspec(dllexport) int sum(int x, int y);
math.cpp
1 #include"pch.h" 2 #include"math.h" 3 4 int sum(int x, int y) 5 { 6 return x + y; 7 }
创建测试工程的过程跟上面一样,就不重复演示了。主要就是第2步链接obj文件那里,这里换成生成的lib文件路径
$(SolutionDir)$(Configuration)\Dll.lib
测试代码:
1 #include "pch.h" 2 #include "CppUnitTest.h" 3 #include "../Dll/math.h" 4 5 using namespace Microsoft::VisualStudio::CppUnitTestFramework; 6 7 namespace DllTests 8 { 9 TEST_CLASS(DllTests) 10 { 11 public: 12 13 TEST_METHOD(Math) 14 { 15 auto result = sum(2, 2); 16 Assert::IsTrue(result == 4); 17 } 18 }; 19 }
推荐阅读:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?