使用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主控台应用程序项目:

 


 

在此以一个简单的计算器为范例,请新增Calculator.h与Calculator.cpp,并撰写以下程序代码:

Calculator.h

 

view sourceprint?
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

 

view sourceprint?
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.}

撰写完成后,项目应该如下图所示:

 


 

Step 2. 设定Production Code组态
请在方案总管中,对CalculatorProject按右键,于项目属性窗口中[组态属性]->[一般]->[项目默认值]->[组态属性]设定成"静态链接库 (.lib)"

 


 

建立测试项目
Step 3. 建立测试项目
请在同一方案中,新增测试项目:

 


 

Step 4. 设定测试项目组态
请在方案总管中,对CalculatorProjectUnitTest按右键,于项目属性窗口中进行以下设定:

1. 在[VC++目录]->[Include目录]设定参考Production Code的标头档

 


 

2. 在[VC++目录]->[链接库目录]设定参考Production Code预设的lib输出位置

 


 

3. 在[连结器]->[输入]设定连结Production Code输出的lib

 


 

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

 

view sourceprint?
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. 开启测试总管进行测试
撰写完成测试程序代码并且建置完成后,在工具列的[测试]->[窗口]->[测试总管]叫出测试总管画面,可以看到我们刚刚撰写的测试范例正等待我们去执行:

 


 

按下黄框处的[全部执行]即可开始执行单元测试啦!

执行完测试后,我们选取该测试单元,在下方会出现[输出]的按钮,可以叫出测试时使用Logger纪录的信息欧~

 


 

有可以针对测试结果进行Code Coverge分析:

 


 

结论
相信透过上面这个简单的小范例,读者应该可以建立出属于自己的Testing项目,VS 2012提供的测试项目与测试窗口,让我们可以更方便的进行测试工作,让我们一起建构强健、好用的应用程序吧!! ^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博 客 文 章】

1、C#中的Explicit和Implicit转载于:https://www.cnblogs.com/kikyoqiang/p/10270416.html

sql intersect mysql_SQL INTERSECT子句

SQL INTERSECT子句/操作符用于合并两个SELECT语句&#xff0c;但只从第一个SELECT语句返回完全相同于第二个SELECT语句结果的所有行。这意味着INTERSECT是由两个SELECT语句返回相同的行(唯一)。正如使用UNION操作&#xff0c;同样的规则可使用在INTERSECT运算符。 但MySQL不支持…

vs2010下release版本调试设置

设置在Release模式下调试的方法&#xff1a; 1.工程项目上右键 -> 属性 2.c -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意&#xff1a;如果是库的话&#xff0c;只能(Zi) 3.c -> 优化 -〉优化 选 禁止&#xff08;/Od&#xff09; 4.连接…

控制反转 java_控制反转( Ioc)快速入门

2.1 什么是控制反转(IOC&#xff1a;Inverse of Control)IOC反转控制&#xff0c;实际上就是将对象的创建权交给了Spring&#xff0c;程序员无需自己手动实例化对象。可以看出来工厂的作用就是用来解耦合的&#xff0c;而在使用spring的过程中&#xff0c;spring就是充当这个工…

spring 工作流引擎_带Spring的简单工作流引擎

spring 工作流引擎几个月前&#xff0c;在处理一个公司项目时&#xff0c;我们需要开发REST服务&#xff0c;该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间&#xff0c;我们决定创建简单的工作流引擎&#xff0c;该引擎将为发送电子邮件收费&#xf…

如何成为一个牛逼的C/C++程序员? (仔细阅读)

这个题目的噱头太大&#xff0c;要真的写起来&#xff0c; 足够写一本书了。 本人是过来人&#xff0c; 结合自身的体会和大家交流一下&#xff0c;希望新人能少走弯路。 每个人的情况不一样&#xff0c;我下面的描述可能并不适合每一个看到这篇文章的人。 一、C/C语言 如果你的…

java 两个字段排序,如何在Java中按两个字段排序?

I have array of objects person (int age; String name;).How can I sort this array alphabetically by name and then by age?Which algorithm would you use for this ?解决方案You can use Collections.sort as follows:private static void order(List persons) {Colle…

数据结构java语言描述朱战立_数据结构——树(Java语言描述)

树根:rootNode. 树只有一个树根。节点:Node. 树上的所有节点。子节点数组:Node[]. 数组代表每个节点的所有子节点父节点:parentNode. 每个节点只有一个父节点。2. Node为Tree中的内部类parent &#xff1a;指向父节点的引用childern: 孩子数组&#xff0c;存储该节点的所有子节…

centos7.4进入单用户模式

centos7.4进入单用户模式 1 - 在启动grub菜单&#xff0c;选择编辑选项启动2 - 按键盘e键&#xff0c;来进入编辑界面 3 - 找到Linux 16的那一行&#xff0c;将ro改为rw init/sysroot/bin/sh 4 - 现在按下 Controlx &#xff0c;使用单用户模式启动 5 - 现在&#xff0c;可以使…

判断某程序是64位还是32位

1. 用代码判断本身if (IntPtr.Size 4) {// 32-bit}else if (IntPtr.Size 8){// 64-bit}2. 用代码判断正在运行的其他进程http://stackoverflow.com/questions/1953377/how-to-know-a-process-is-32-bit-or-64-bit-programmatically3. 不用代码判断任意exe&#xff0c;看第二个…

MySQL 中 NULLIF 、IFNULL、IF 的用法和区别

在 MySQL 中&#xff0c;NULLIF、IFNULL 和 IF 是用于处理 NULL 值的三种不同的函数。 1. NULLIF 函数 NULLIF 函数用于比较两个表达式&#xff0c;如果它们的值相等&#xff0c;则返回 NULL&#xff0c;否则返回第一个表达式的值。语法如下&#xff1a; NULLIF(expr1, expr2…

32和64位jvm_我应该使用32位还是64位JVM?

32和64位jvm这是我在企业软件开发生涯中多次遇到的问题。 我不得不每隔一段时间就提供有关配置特定新环境的建议。 而且&#xff0c;很多时候&#xff0c;手头的问题与“我应该使用32位或64位JVM”有关。 老实说&#xff0c;一开始我只是掷硬币。 而不是给出合理的答案。 &…

spring java code配置_Spring-09-使用Java的方式配置Spring

9. 使用Java的方式配置Spring我们现在要完全不使用Spring的xml配置&#xff0c;全权使用Java来配置Spring&#xff01;JavaConfig是Spring的一个子项目&#xff0c;在Spring4之后&#xff0c;他成为了一个核心功能。实体类&#xff1a;public class User {private String name;…

pythone函数基础(11)读,写,修改EXCEL

#读EXCEL需要导入xlrd模块---在python控制台pip install xlrd模块import xlrdbook xlrd.open_workbook(stu3.xls)sheet book.sheet_by_index(0)# sheet book.sheet_by_name(sheet1)# print(sheet.cell(0,0).value)#获取指定单元格的内容# print(sheet.cell(1,0).value)# pri…

强大的vim配置文件,让编程更随意

花了很长时间整理的&#xff0c;感觉用起来很方便&#xff0c;共享一下。 我的vim配置主要有以下优点&#xff1a; 1.按F5可以直接编译并执行C、C、java代码以及执行shell脚本&#xff0c;按“F8”可进行C、C代码的调试 2.自动插入文件头 &#xff0c;新建C、C源文件时自动插…

java工程转maven工程_将java工程转换为Maven工程

1、创建一个Java工程&#xff0c;如下图所示&#xff1a;2、选中此工程 -> 右键 -> Configure -> Convert to Maven project。出现如下的截图&#xff1a;3、点击之后会弹出对话框&#xff0c;如下图所示&#xff1a;4、直接点击完成即可&#xff0c;此时会在java工程…

2019/4/17 Linux学习

一、Linux的文件系统 其中/prov、/srv、/sys 文件为文件系统&#xff0c;技术不过硬不要去修改&#xff1b;二、关于Xshell、Xft1、服务器的端口可有65535个可设置&#xff0c;开的越多安全性越差&#xff1b;2、远程登录主机时&#xff0c;会有一个sshd程序&#xff0c;22端口…

使用“另类” Cloud Foundry Gradle插件无需停机

我一直在尝试我的手在写一个gradle这个插件的应用程序部署到Cloud Foundry上 &#xff0c;并写下这个插件在我以前的帖子 。 我现在通过使用两种方法支持将无停机时间部署到Cloud Foundry中来增强此插件&#xff1a; 自动驾驶风格部署和更常用的蓝绿色风格部署 。 要完全了解该…

UNIX网络编程 卷2 源代码使用

1. 下载源码&#xff0c;W. Richard Stevens的主页&#xff1a;http://www.kohala.com/start/wget http://www.kohala.com/start/unpv22e/unpv22e.tar.gz -P /usr/local/src 2. 解压tar xvf /usr/local/src/unpv22e.tar.gz -C /root/bin 3. 编译库文件cd /root/bin/unpv22e/ .…

语言工程中有趣的事情

如果您阅读此博客&#xff0c;您将知道我坚信语言的力量。 因此&#xff0c;我当然有很大的偏见&#xff0c;但是我感觉语言工程社区正在增长&#xff0c;并且越来越有趣的东西正在涌现。 为此&#xff0c;我认为通过查看社区中正在发生的事情并列出一些我发现有趣的事情来结束…