使用VS2012内建的C++测试架构进行单元测试
前言
在软件开发的过程中,单元测试(Unit testing)是一个重要的coding步骤,可以让你的程序代码质量大幅提升、协助你进行良好的程序架构设计,单元测试是针对程序单元(软件设计的最小单位)来进行正确性检验的测试工作,在程序化编程中,一个单元就是单个程序、函式、过程等;对于对象导向编程,最小单元就是方法,包括基础类别(超类)、抽象类、或者衍生类别(子类别)中的方法。
想要在VC++项目中,进行单元测试的Framework有很多选择,例如: CPPUnit、Google GTest...等,自Visual Studio 2012开始,提供了内建的单元测试框架Microsoft.VisualStudio.TestTools.CppUnitTestFramework并且与VS高度整合。
建立Production Code项目
Step 1. 建立Production Code
首先,建立一个基本的Win32主控台应用程序项目:
![](http://www.it165.net/uploadfile/2013/1024/20131024073316518.png)
在此以一个简单的计算器为范例,请新增Calculator.h与Calculator.cpp,并撰写以下程序代码:
Calculator.h
01.
#ifndef _CALCULATOR_H_
02.
#define _CALCULATOR_H_
03.
04.
namespace
CalculatorProject
05.
{
06.
class
Calculator
07.
{
08.
public
:
09.
int
add(
int
x,
int
y);
10.
int
minus(
int
x,
int
y);
11.
int
multiply(
int
x,
int
y);
12.
int
divide(
int
x,
int
y);
13.
};
14.
}
15.
16.
#endif /* _CALCULATOR_H_ */
Calculator.cpp
01.
#include "Calculator.h"
02.
using
namespace
CalculatorProject;
03.
04.
int
Calculator::add(
int
x,
int
y)
05.
{
06.
return
x+y;
07.
}
08.
09.
int
Calculator::minus(
int
x,
int
y)
10.
{
11.
return
x-y;
12.
}
13.
14.
int
Calculator::multiply(
int
x,
int
y)
15.
{
16.
return
x*y;
17.
}
18.
19.
int
Calculator::divide(
int
x,
int
y)
20.
{
21.
return
x/y;
22.
}
撰写完成后,项目应该如下图所示:
![](http://www.it165.net/uploadfile/2013/1024/20131024073412841.png)
Step 2. 设定Production Code组态
请在方案总管中,对CalculatorProject按右键,于项目属性窗口中[组态属性]->[一般]->[项目默认值]->[组态属性]设定成"静态链接库 (.lib)"
![](http://www.it165.net/uploadfile/2013/1024/20131024073438679.png)
建立测试项目
Step 3. 建立测试项目
请在同一方案中,新增测试项目:
![](http://www.it165.net/uploadfile/2013/1024/20131024073611478.png)
Step 4. 设定测试项目组态
请在方案总管中,对CalculatorProjectUnitTest按右键,于项目属性窗口中进行以下设定:
1. 在[VC++目录]->[Include目录]设定参考Production Code的标头档
![](http://www.it165.net/uploadfile/2013/1024/20131024073732694.png)
2. 在[VC++目录]->[链接库目录]设定参考Production Code预设的lib输出位置
![](http://www.it165.net/uploadfile/2013/1024/20131024073804843.png)
3. 在[连结器]->[输入]设定连结Production Code输出的lib
![](http://www.it165.net/uploadfile/2013/1024/20131024073905463.png)
Step 5. 撰写测试程序代码
可以先将测试项目预设的"unittest1.cpp"更名为"CalculatorTest.cpp",建议命名规则如下:
TEST_CLASS命名原则: ClassName + "Test",其中ClassName 为对应测试Production Code里头的类别名称
TEST_METHOD命名原则: "test" + MethodName,其中MethodName为对应测试Production Code里头的方法名称
以下为几点注意事项:
1. 记得引入欲测试的类别之标头档,如: 引入#include "Calculator.h"
2. TEST_METHOD_INITIALIZE(setUp) 、TEST_METHOD_CLEANUP(tearDown) 为执行每一个TEST_CASE前、后会执行的Code
3. 可以使用Logger::WriteMessage("")来记录测试中需要输出的信息
CalculatorTest.cpp
01.
#include "stdafx.h"
02.
#include "CppUnitTest.h"
03.
#include "Calculator.h"
04.
#include <iostream>
05.
using
namespace
std;
06.
using
namespace
Microsoft::VisualStudio::CppUnitTestFramework;
07.
08.
namespace
CalculatorProject
09.
{
10.
TEST_CLASS(CalculatorTest)
11.
{
12.
private
:
13.
Calculator *calculator;
14.
public
:
15.
TEST_METHOD_INITIALIZE(setUp)
16.
{
17.
// method initialization code
18.
Logger::WriteMessage(
"CalculatorTest setUp()\n"
);
19.
calculator =
new
Calculator();
20.
}
21.
22.
TEST_METHOD_CLEANUP(tearDown)
23.
{
24.
// test method cleanup code
25.
Logger::WriteMessage(
"CalculatorTest tearDown()\n"
);
26.
delete
calculator;
27.
}
28.
29.
TEST_METHOD(testAdd)
30.
{
31.
Assert::AreEqual(9, calculator->add(6,3));
32.
Logger::WriteMessage(
"testAdd() finish testing!\n"
);
33.
}
34.
35.
TEST_METHOD(testMinus)
36.
{
37.
Assert::AreEqual(3, calculator->minus(6,3));
38.
Logger::WriteMessage(
"testMinus() finish testing!\n"
);
39.
}
40.
41.
TEST_METHOD(testMultiply)
42.
{
43.
Assert::AreEqual(18, calculator->multiply(6,3));
44.
Logger::WriteMessage(
"testMultiply() finish testing!\n"
);
45.
}
46.
47.
TEST_METHOD(testDivide)
48.
{
49.
Assert::AreEqual(2, calculator->divide(6,3));
50.
Logger::WriteMessage(
"testDivide() finish testing!\n"
);
51.
}
52.
};
53.
}
Step 6. 开启测试总管进行测试
撰写完成测试程序代码并且建置完成后,在工具列的[测试]->[窗口]->[测试总管]叫出测试总管画面,可以看到我们刚刚撰写的测试范例正等待我们去执行:
![](http://www.it165.net/uploadfile/2013/1024/20131024074017719.png)
按下黄框处的[全部执行]即可开始执行单元测试啦!
执行完测试后,我们选取该测试单元,在下方会出现[输出]的按钮,可以叫出测试时使用Logger纪录的信息欧~
![](http://www.it165.net/uploadfile/2013/1024/20131024074046218.png)
有可以针对测试结果进行Code Coverge分析:
![](http://www.it165.net/uploadfile/2013/1024/20131024074116129.png)
结论
相信透过上面这个简单的小范例,读者应该可以建立出属于自己的Testing项目,VS 2012提供的测试项目与测试窗口,让我们可以更方便的进行测试工作,让我们一起建构强健、好用的应用程序吧!! ^_^
使用VS2012内建的C++测试架构进行单元测试相关推荐
- 怎么测试服务器端口是否对外开放_从零开始内建你的安全测试流程
一. 安全测试的意义 安全问题,没发生的时候我们可以侥幸,一旦发生生产安全问题,对很多公司来说可能就是黑天鹅事件了.平台的安全,是我们测试中不可舍弃的一环,而且需要长期持续的关注. 二. 从哪里入手 ...
- 从零开始内建你的安全测试流程
一. 安全测试的意义 安全问题,没发生的时候我们可以侥幸,一旦发生生产安全问题,对很多公司来说可能就是黑天鹅事件了.平台的安全,是我们测试中不可舍弃的一环,而且需要长期持续的关注. 二. 从哪里入手 ...
- 树莓派第三代跨越发展,采用64位处理器内建WiFi及蓝牙
Raspberry Pi(树莓派)前不久在Raspberry Pi Foundation基金会成立四周年纪念日之际对外发布了新产品Model 3,其定价仍然在35美元(30英镑),和上一版Raspbe ...
- DevOps中的质量内建实践
点击观看大咖分享 什么是质量内建 随着时间的推移,我们项目的开发效率会逐渐降低,直到几年之后整个项目可能就无法维护,只能推倒重来.具体的表现首先就是随着时间推移,我们会发现整个需求列表里面能做的需求越 ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- Python属性和内建属性
属性property 1. 私有属性添加getter和setter方法 class Money(object):def __init__(self):self.__money = 0def getMo ...
- python标准类型内建模块_Python内建模块struct实例详解
本文研究的主要是Python内建模块struct的相关内容,具体如下. Python中变量的类型只有列表.元祖.字典.集合等高级抽象类型,并没有像c中定义了位.字节.整型等底层初级类型.因为Pytho ...
- Django内建模版标签和过滤器
第四章列出了许多的常用内建模板标签和过滤器.然而,Django自带了更多的内建模板标签及过滤器.这章附录列出了截止到编写本书时,Django所包含的各个内建模板标签和过滤器,但是,新的标签是会被定期地 ...
- 【转】测试架构师团队的管理
识人:通常有丰富工作经验的人已懂的如何伪装自己,如果你看不出一个员工的缺点,则你对员工沟通了解太少,是件危险的事.而一个员工的缺点是以相似案例2个以上为标准,才能认为是他的缺点.识人时,有个误区就是如 ...
最新文章
- Exchange bin先常用工具
- 解读Cardinality Estimation算法(第三部分:LogLog Counting)
- C# 自定义 implicit和explicit转换
- C++fast power快速指数的实现(附完整源码)
- U-Boot顶层Makefile分析
- 隐藏wp login.php,Wordpress 隐藏登陆链接
- 移动设备测试 6 free mobile device emulators for testing your site
- 软件的测试文档,软件-测试文档模版.doc
- listview当选中某一个item时设置背景色其他的不变
- linux fuse文件系统在 android fuse sdcard的 运用
- python+grpc+yolo 目标检测实践
- python批处理远程关机脚本,python实现远程通过网络邮件控制计算机重启或关机
- Windows开启SSH连接
- Entrepreneur\'s Credo of the American 美国的企业家宣言
- uniapp 定位服务_uniapp使用高德地图定位
- html用九张图片做出九宫图,用ps如何将九张照片做成九宫格?
- 3.acwing3373. 进制转换
- redmine插件安装
- 2021年中国乳制品行业发展现状分析,“双循环”助力行业发展「图」
- Java虚拟机JVM简介与理解(三)