<VS2017> 编写VC++单元测试 -(一)新建单元测试工程
开发人员自己编写单元测试是一个非常好的习惯。单元测试不但能够验证自己所编写的代码是否存在问题,避免提交给测试人员时才发现bug,也可以为将来改动代码的人提供验证代码功能正确性的途径。在我有限的工作生涯中并未写过太多单元测试,所以我在这方面亦存在诸多不足,所述如果有纰漏,还望各位读者不吝指点。
单独的单元测试工程一般是为了测试暴露给外部程序调用的接口,这样可以保证调用者(单元测试程序)和被调用者(接口)的分离。不过有些时候,我们也要给工程的内部关键方法写一些单元测试,这个时候就需要将测试用例写在工程内部。首先我们先来学习一下如何创建一个单元测试工程。
1. 准备工作
我们先创建一个动态链接库工程,并准备好一个导出函数。关于如何创建动态链接库我就不赘述了,我们导出的函数如下:
int getOddCount(int number)
{
int nCount = ; for (int i = ; i <= number; i++)
{
if (i % != )
{
nCount++;
}
} return nCount;
}
这个函数的功能是,给定一个整数,返回1到这个整数范围内的所有奇数的个数。
为了配合单元测试,请保证这个动态链接库工程能够正常生成dll和对应的lib文件,并提供导出函数对应的头文件。
2. 创建单元测试工程
在Solution中单击右键,创建新的单元测试工程。这里我们选择Native Unit Test Project.

工程名字可以随便写,暂时用默认的就可以。
工程创建完成够,整个solution的结构应该如下图所示:

其中在unittest1.cpp中是自动生成的单元测试模板。
3. 配置单元测试工程
为了能够让单元测试工程和我们创建的动态链接库工程关联上,我们需要做如下配置。
首先,让单元测试工程引用动态链接库工程。

然后再将动态链接库的代码路径加入到单元测试的Include Directories。
4. 编写单元测试代码
我们先简单看一下unittest1.cpp这部分代码。
namespace UnitTest1
{
TEST_CLASS(UnitTest1)
{
public: TEST_METHOD(TestMethod1)
{
// TODO: Your test code here
} };
}
namespace UnitTest1 :
这个命名空间名字可以改,但是建议和文件名一致,这样方便以后看代码
TEST_CLASS(UnitTest1) :
这个宏设定单元测试的类的名称,单元测试的名字也尽量要可读。需要注意的是这是class的名字,需要符合class的命名规范
TEST_METHOD(TestMethod1) :
要测试的方法,名字也可以随便起,但是最好要和要测试的方法保持一致。比如要测试的方法叫做method,那么测试方法就叫TestMethod。
在编写测试代码时和正常编码并没有什么不同。单元测试的主要思想是通过给定输入以及预期的输出,来判断方法实现是否有问题。比如要测试一个求和函数,输入为1和2,那么预期输出是3。如果调用方法之后得到的结果不是3,那么这个测试用例就会失败,单元测试结果则为失败。
具体到我们这个测试,参照如下代码,输入参数是10,那么我们应该得到的结果是5,因为1到10之间共有5个奇数。
(注意,不要忘记在unittest1.cpp中include动态链接库的头文件)
TEST_METHOD(TestMethod1)
{
Assert::AreEqual(getOddCount(), );
}
在单元测试中,需要使用Assert这个类中的方法对结果进行判断,这样测试结果才会正确的反馈到IDE中。上面的代码中用到的是AreEqual方法,用于判断预期结果与方法调用后的结果是否相同。
Assert类中有很多用于测试的方法,除了相等还有不等,真假等等,也有让测试强制失败的方法,可以根据具体的情况是使用。
测试代码写完后,我们编译整个solution或者编译单元测试project,如果编译没有问题的话,就可以开始测试了。
5. 运行单元测试
在上一步中,如果没有编译问题的话,我们就可以在Test Explorer中看到现在所有的单元测试。注意,如果更新了单元测试代码,需要对project重新进行编译。通过菜单中的Test->Windows->Test Explorer可以打开Test Explorer。

在Test Explorer中点击Run All就会开始运行所有的单元测试。稍等一会,如果测试通过,就会有如下图显示:

这绿色看着真舒服(?)。那么如果测试未通过呢?
让我们再修改一下我们的代码,让我们的getOddCount函数产生一点小小的错误…
int getOddCount(int number)
{
int nCount = ; for (int i = i <= number; i++)
{
if (i % != )
{
nCount++;
}
} return nCount;
}
重新编译整个solution之后,再次重新运行所有的单元测试…

啊...多么醒目的红色...
双击失败的单元测试,我们可以快速定位到出错的地方。
6. 可能遇到的错误
如果使用的时x64平台,可以会因为单元测试工程和目标工程的平台(x86和x64)不一致导致运行时错误,错误提示如下:
Make sure that test discoverer & executors are registered and platform & framework version settings are appropriate and try again.
这个时候只要通过菜单Test -> Test Settings -> Default Processor Architecture调整单元测试使用的CPU架构即可。
到这里,关于使用单元测试工程的基本内容就讲完了,如果想有更深一步的了解,可以参考MSDN官方文档。
下一次,我将讲一下如何创建工程内部的单元测试(不使用单独的project)。
<VS2017> 编写VC++单元测试 -(一)新建单元测试工程的更多相关文章
- 使用 xUnit 编写 ASP.NET Core WebAPI单元测试
本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一.创建示例项目 模板为我们自动创建了一个Value ...
- 利用反射编写私有 Private 方法的单元测试
利用反射编写私有 Private 方法的单元测试 最近在添加一个新feature时,鉴于要给自己的代码一是增加代码的强壮性,二是增加代码测试的覆盖率.但是遇到了有些方法是 Private 的,但是在调 ...
- vs2012新建单元测试
多写单元测试也是算向优秀程序员迈进吧((ˇˍˇ)),就像我们小时候做算算术一样,老师会交给我们怎么样检验答案是否正确性.那么我们做程序员也一样,检验自己写的代码是否和我们预期的结果一样!项目小还行,但 ...
- 【Python】[技术博客] 如何对使用PYQT编写的GUI文件进行单元测试
如何对使用PYQT编写的GUI文件进行单元测试 想要对PYQT编写的GUI文件进行单元测试,我们主要用到QTest QTest里面包含了一些对窗体的各种控件进行模拟操作的函数,通过QTest对窗体进行 ...
- Visual Studio 2010 单元测试之一---普通单元测试
原文:Visual Studio 2010 单元测试之一---普通单元测试 本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试. 首先来介绍普通单元 ...
- .net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境
系列目录 单元测试及测试驱动开发简介 什么是单元测试 单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验.单元测试几乎都是用单元测试框架编写的.单 ...
- Xamarin iOS编写第一个应用程序创建工程
Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后,就可以在Xamarin Studio中编写程序了.本节将主要讲解在Xamarin Studio中如何进行工程的 ...
- Keil MDK入门---从新建一个工程开始
熟悉Keil C51的朋友对于Keil MDK上手应该比较容易,毕竟界面是很像的.但ARM内核毕竟不同于51内核,因此无论在设置上还是在编程思想上,都需要下番功夫研究的.本文以MDK V4.03为例, ...
- Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程
Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术 ...
随机推荐
- BUILDING ANGULAR APPS USING FLUX ARCHITECTURE
Flux is an architectural pattern based on unidirectional data flow. Although it is originated in the ...
- Apache ab.exe压测工具使用
Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力. 1,打开cmd,找到安装apache的目录,cd 目录进去, ...
- 用U盘安装Ubuntu主系统
用U盘安装Ubuntu主系统 0. 学习Ubuntu系统的的动机 ubuntu系统的内核是linux系统,通过Ubuntu的学习,掌握lInux服务器搭建!!!! 硬件要求:闲置的笔记本 + U盘 ...
- hdu 4281 Judges' response(多旅行商&DP)
Judges' response Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 咏南中间件增加HTTPS.SYS支持
咏南中间件增加HTTPS.SYS支持 老客户可免费升级. HTTPS.SYS可以开发强大而稳定的REST SERVER. 微软在Windows Vista (server 2008) 以后使用http ...
- 算法 - 最小m段和问题
题目分析 给定n个整数组成的序列,要求将序列分割为m段,每段子序列中的数在原序列中连续排列,求使得子段和的最大值达到最小的分割方法 解题方法 状态转移方程 State[i][j]表示前i个数据分成j段 ...
- WIN7或2008远程连接特别慢的解决方法 【转】
方法一. 原因在于从vista开始,微软在TCP/IP协议栈里新加了一个叫做“Window Auto-Tuning”的功能.这个功能本身的目的是为了让操作系统根据网络的实时性能,(比如响应时间)来动态 ...
- .net读写xml
XML文件 <?xml version="1.0" encoding="utf-8"?> <book> <title>web ...
- VS中C#连接SQLite数据库处理器架构“x86”不匹配的问题
原文链接 https://www.cnblogs.com/zhaoliankun/p/9088200.html 我的环境配置:windows 64,VS,SQLite(点击下载),System.Dat ...
- c# Net XML文档(2,2)中有错误
错误如图所示: xml转实体,需求很简单,度娘找了几个方法试了下,转换代码仔细看了看 没毛病啊 但是 就是提示 XML文档(2,2)中有错误,百度搜索了一大会 没解决方案,仔细分析了一下, 最后发现 ...