VS C++单元测试和代码覆盖率资料.docx
- 文档编号:25859651
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:25
- 大小:1.23MB
VS C++单元测试和代码覆盖率资料.docx
《VS C++单元测试和代码覆盖率资料.docx》由会员分享,可在线阅读,更多相关《VS C++单元测试和代码覆盖率资料.docx(25页珍藏版)》请在冰豆网上搜索。
VSC++单元测试和代码覆盖率资料
VS2012C++单元测试和代码覆盖率
1VS2012下C++代码简单单元测试
在网上关于VS2008VS2010VS2012的单元测试几乎都是关于C#的单元测试,我测试了一下,C#的单元测试确实好用,然而关于C++的单元测试很少,在这里我来简单的介绍一下步骤。
普通的工程关键步骤是要包含头文件和obj文件;如果是要测试静态库或者动态库,关键步骤是要包含头文件和lib文件。
1.1在VS2012中建立要测试的简单的工程
在这里要测试的代码建立如下:
新建一个“Win32控制台应用程序”,默认它的名称“ConsoleApplication1”,
图表11新建“Win32控制台应用程序”
图表12进入向导
图表13进入向导2
在“进入向导2”中选择“空项目”。
然后按“完成”。
然后添加头文件和源代码文件,文件目录如下:
图表14简单代码目录结构
下面是具体的代码:
//AddFunc.h
#ifndef__ADD_FUNC_H__
#define__ADD_FUNC_H__
intAddFunc(inta,intb);
#endif
//AddFunc.cpp
#include"AddFunc.h"
intAddFunc(inta,intb)
{
returna+b;
}
//MultiFunc.h
#ifndef__MULTI_FUNC_H__
#define__MULTI_FUNC_H__
intMultiFunc(inta,intb);
#endif
//MultiFunc.cpp
#include"MultiFunc.h"
intMultiFunc(inta,intb)
{
returna*b;
}
//SubFunc.h
#ifndef__SUB_FUNC_H__
#define__SUB_FUNC_H__
intSubFunc(inta,intb);
#endif
//SubFunc.cpp
#include"SubFunc.h"
intSubFunc(inta,intb)
{
returna-b;
}
//main.cpp
#include"AddFunc.h"
#include"SubFunc.h"
#include"MultiFunc.h"
intmain(intargc,char*argv[])
{
return0;
}
编译链接此工程,生成一系列的obj文件。
在这里我要对上面的函数进行单元测试。
1.2建立测试工程
选中“解决方案”ConsoleApplication1(1个项目)”后右键点击,选中“添加”->“新建项目”,如“图表15新建测试工程”所示。
图表15新建测试工程
选择“测试”->“托管测试项目”,输入名称“UnitTest_First”,按“确定”
图表16新建UnitTest1测试工程
建立测试工程后的目录结构如“图表17建立测试工程后的目录结构”所示
图表17建立测试工程后的目录结构
选中测试工程中的“UnitTest.cpp”源文件,打开看一下代码如图“”所示。
图表18源文件UnitTest.cpp的代码
主要用的测试模块在
usingnamespaceMicrosoft:
:
VisualStudio:
:
TestTools:
:
UnitTesting;
中。
1.3编写测试工程中的测试代码
先编写一个对于加法的简单测试代码,在“voidTestMethod1()”下添加如下测试代码:
intna=1,nb=3,nExpect=4;
intnReal=AddFunc(na,nb);
Assert:
:
AreEqual(nReal,nExpect);
当然得把加法的头文件包含过来。
#include"../ConsoleApplication1/AddFunc.h"
添加头文件和代码后的代码如图“图表19添加头文件后的代码”和“图表110添加测试加法源代码后的代码”所示。
图表19添加头文件后的代码
图表110添加测试加法源代码后的代码
还得把加法的obj文件包含进来。
添加方法如图“图表110添加被测试工程的obj”所示。
图表111添加被测试工程的obj
描述:
选中测试工程“UnitTest_First”右击,“配置属性”->“链接器”->“输入”->“附加依赖项”->“<编辑…>”,输入
“..\ConsoleApplication1\Debug\AddFunc.obj”
1.4运行测试工程查看结果
1.4.1设置“公共语言运行时支持”
如图“图表111设置公共语言支持方法”所示。
图表112设置公共语言支持方法
描述:
选中测试工程“UnitTest1”右击,选择“属性”,“配置属性”->“常规”->“公共语言运行时支持”->“公共语言运行时支持(/clr)”,按确定。
1.4.2打开“测试资源管理器”
打开方法如图“图表112打开“测试资源管理器”步骤”所示。
图表113打开“测试资源管理器”步骤
打开后可以看到右侧添加了“测试资源管理器”,
图表114“测试资源管理器”示意图
1.4.3运行测试工程
在“图表112“测试资源管理器”示意图”中选中“TestMethod1”右击,选择“运行选定的测试”。
图表115选择单元进行测试
测试结果显示绿色,代表测试成功,如“图表113测试结果成功图”所示。
图表116测试结果成功图
1.5添加其他的测试单元进行测试
1.5.1添加头文件
#include"../ConsoleApplication1/AddFunc.h"
#include"../ConsoleApplication1/MultiFunc.h"
#include"../ConsoleApplication1/SubFunc.h"
图表117添加所有需要测试单元的头文件的示意图
1.5.2添加obj
..\ConsoleApplication1\Debug\MultiFunc.obj
..\ConsoleApplication1\Debug\SubFunc.obj
图表118添加所有需要测试单元的obj示意图
1.5.3添加测试单元代码
[TestMethod]
voidTestMethodMultiFunc()
{
intna=1,nb=3,nExpect=4;
intnReal=MultiFunc(na,nb);
Assert:
:
AreEqual(nReal,nExpect);
};
[TestMethod]
voidTestMethodSubFunc()
{
intna=1,nb=3,nExpect=4;
intnReal=SubFunc(na,nb);
Assert:
:
AreEqual(nReal,nExpect);
};
1.5.4重新编译生成测试工程“UnitTest_First”
重新编译生成后,“测试资源管理器”中添加了两个测试单元,如图“图表119新添加的测试单元示意图”所示
图表119新添加的测试单元示意图
可以看到是“TestMethodMultiFunc”和“TestMethodSubFunc”两个测试单元为红叉,是因为这两个测试代码不对。
修改一下期望值,如下所示:
//以下是自己添加的代码。
[TestMethod]
voidTestMethodMultiFunc()
{
intna=1,nb=3,nExpect=3;
intnReal=MultiFunc(na,nb);
Assert:
:
AreEqual(nReal,nExpect);
};
[TestMethod]
voidTestMethodSubFunc()
{
intna=1,nb=3,nExpect=-2;
intnReal=SubFunc(na,nb);
Assert:
:
AreEqual(nReal,nExpect);
};
再“重新生成”测试工程“UnitTest_First”,可以看到都为绿色了。
图表120修改期望值后的测试结果
也可以对没有测试通过的代码直接定位,假如没有测试通过的结果如下:
图表121直接定位没有测试通过的测试单元
定位方法:
双击“TestMethodMultiFunc”就会出现哪个代码没有通过。
大功告成!
有了好用的单元测试,以后写C++代码就有点靠谱的安全感了。
1.6参考笔记
2011-5-15
GoogleTest也是一个不错的C++单元测试框架。
如果项目引入了boost,还可以考虑boost.test库。
2011-12-16
若测试项目运行结果全部为黄色感叹号错误,报错为“System.IO.FileNotFoundException:
找不到指定的模块。
(异常来自HRESULT:
0x8007007E)”,可参考R6034解决方案。
2011-12-27
VS2010创建的C++/CLI测试项目,Debug下默认的运行时库为“多线程DLL(/MD)”而不是“多线程调试DLL(/MDd)”,这可能会造成链接时报LNK2022。
参考:
VC运行时库
2012-3-6
VS2008下若出现UnitTest长时间挂起,可采用KB970449热修复。
参考:
VS2008Unittest“Pending”andthetestcannotbecompleted,强大的stackoverflow!
2012-5-19
VS2010下创建C++/CLI测试项目,默认的“目标文件名”为“DefaultTest”,当同一个解决方案中包含多个测试项目时因目标文件名相同,会冲突!
可手工将每个项目的“目标文件名”设置为“$(MSBuildProjectName)”或其他合理值解决。
2012-11-13
建议VS2012下的C++/CLIUnitTest项目设置如下:
1.调整“输出目录”为“$(Configuration)\”,以避免同一个project在多个solution间共享时当前路径错误
2.调整“目标文件名”为“$(MSBuildProjectName)”,以避免同一个solution内多个C++/CLIUnitTest项目时目标文件名冲突
VS2012下CLIUnitTest的CurrentDirectory为项目的输出目录,这和VS2008、VS2005是不同的
2VS2010做单元测试,代码覆盖率
直接点击“测试”->“分析代码覆盖率”->“所有测试”就可以得到结果。
图表21分析代码覆盖率结果
2.1参考笔记
Precodition:
VS2010
待测试工程 demo.dll ,被测试的工程是个dll,这个怎么写就不介绍了.
1.在被测试工程的sln中,选择[测试]菜单,选择<新建测试> ----><单元测试>,确定.
确定后,会在"解决方案资源管理器"中生成 "SolutionItems" 和TestProject4,第一次应该是TestProject1,这里p2plive是被测试的DLL
2. 在TestProject4种"引用"p2plive
3. include 被测试dll的head文件.
属性 -----> 配置属性----->C/C++----->常规----->附加包含目录$(SolutionDir) 的相对路径
4.编译测试工程TestProject4
在测试文件中调用被测试DLL的API,编译
出现各种错误提示,无法识别等.
选择 公共语言运行时支持(/clr), 不能使用(/clr:
safe)
5.设置代码覆盖率
如图,选择 数据和诊断,双击 "代码覆盖率", 选择 p2plived.dll, "确定",然后"另存",覆盖.
在测试工程和被测试工程中设置/Profile,否则无法生成覆盖率文件.
6设置测试
"测试"-----> "选择活动的测试设置" ----->"Local testsetting"
"测试"-----> "窗口"----->测试列表编辑器
7.运行
"测试"----->"运行"----->"解决方案中的所有方案"
8察看代码覆盖率
"测试"----->"窗口"----->"代码覆盖率结果"
Q&A:
上述过程中有坑的地方基本上都提到了,还有一处需要注意,运行几次后,后提示"无法linkDefaultTest.dll,显示这个应该是被测试工程的,不知道为什么会突然没有了。
不知道如何解决,只能删除测试工程,重新创建一个。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS C+单元测试和代码覆盖率资料 C+ 单元测试 代码 覆盖率 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)