前言

关于单元测试的重要性、gtest的优缺点等就不说了。之前项目是没有做单元测试的,在VS的解决方案中,只有一个可执行的工程,其他的工程都是以DLL库的形式提供。本文只针对使用VS对DLL库进行单元测试,做一些记录。

下载编译gtest

下载gtest不多说,下载什么版本也没太大关系,我下载的是1.7版。在Windows下编译gtest步骤:

(1)将gtest-1.7.0.zip进行解压缩;

(2)用vs打开msvc目录下的gtest.sln工程,需要进行转换编译器;

(3)打开后有四个工程gtest、gtest_main、gtest_prod_test、gtest_unittest;

(4)由于单元测试一般在Debug模式下进行,只需在Debug下编译gtest工程即可,会在msvc/gtest/Debug下生成gtestd.lib库。

新增Gtest_Debug模式

原来工程中已经包含Debug和Release模式,为了不影响以前的工程的使用,专门添加一个Gtest_Debug模式,用于做单元测试。步骤如下

按确定后,会生成对应的Gtest_Debug模式。这时候,可以使用新建的Gtest_Debug编译一把,看能不能编译成功,生成的文件和原来的Debug模式是一模一样的。

部署Gtest头文件与库

(1)把解压出来的gtest头文件目录拷贝到项目原有的include目录

(2)把编译出来的gtestd.lib拷贝到项目的Debug模式生成的目录

改造原代码,添加Gtest的main函数

因为每个实现文件都会包含stdafx.h,避免每个单元测试的实现文件都要添加gtest的头文件,所以在此头文件中添加如下代码。其中GTEST_DEBUG这个宏是前面步骤添加的,这段代码只有在Gtest_Debug模式下才会有效。

 #ifdef GTEST_DEBUG
#include "gtest/gtest.h"
#pragma comment(lib, "gtestd.lib")
#endif

由于把DLL库改为exe应用程序,所以需要添加main函数,以便执行gtest的用例。在工程中新建一个GtestMain.cpp文件,添加如下代码(主要是main函数的实现,用例是用于测试是否成功的)。

 #include "stdafx.h"

 #ifdef GTEST_DEBUG      // 这段代码只能在Gtest_Debug模式下运行

 int add(int a, int b)
{
return a + b;
} TEST(fun, add)
{
EXPECT_EQ(, add(, -));
EXPECT_EQ(, add(, ));
} int main(int argc, wchar_t* argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
} #endif

重新编译工程,会发现工程生成的是exe程序,而不再是DLL程序,把工程设置为启动项目,执行程序即可看到测试结果。

编译测试用例

建议在工程目录下专门建一个test的目录,用于存放测试用例的文件,测试用例的文件和实际工程代码都可以加入到VS工程中。所有的测试用例代码都需要用#ifdef GTEST_DEBUG ... #endif来括起来,以便与实际的工程代码隔离。

参考

使用gtest给DLL工程编写单元测试

http://blog.csdn.net/sogouauto/article/details/47731523

gtest简介及简单使用

http://blog.csdn.net/fengbingchun/article/details/39667571

使用gtest对DLL工程进行单元测试的实践的更多相关文章

  1. VS2013中修改.dll工程项目的.lib和.dll的输出路径

    一个dll工程,生成的两个东西是我们需要的:.lib和.dll,在实际开发过程中我们往往希望这两个东西直接输出到特定文件夹,对于这两个的修改: 设置好之后,对于调用该dll的exe工程,将exe的输出 ...

  2. vs调试dll工程

    dll本身是没法运行的,必须在其它工程调用dll时候才会运行. 所以,调试dll首先要将调用dll的工程和dll工程联系起来. 解决方案中添加dll工程: 现在dll 和 应用程序两个工程就都在一个解 ...

  3. win32 dll工程开发创建对话框

    界面编程的CreateWindow函数需要instance,只要获取到dll工程的main的instance参数,就可以使用CreateWindow函数了. 创建对话框需要CreateDialog函数 ...

  4. linux下使用gtest框架进行c/c++单元测试

    linux下使用gtest框架进行c/c++单元测试 前言 关于此次开发工具的选择,因为我最近尝试在linux下使用vim进行c/c++编程,且之前已经对vim进行了相关的配置,所以这里应作业要求直接 ...

  5. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  6. 4.VS2010C++建立DLL工程

    相关资料: http://blog.csdn.net/jshayzf/article/details/23608705 http://blog.csdn.net/huang_xw/article/de ...

  7. 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架

    转载来源:https://www.cnblogs.com/coderzh/archive/2009/04/12/1434155.html 一.前言 上一篇我们分析了gtest的一些内部实现,总的来说整 ...

  8. DLL工程没有生成对应的lib文件

    要至少导出一个函数/变量才能产生lib 也就是说得用到__declspec(dllexport)

  9. 使用javaconfig方式配置spring工程的单元测试

    添加@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {MoveModelSpringTestConfig ...

随机推荐

  1. Sublime Text 3 绿色汉化版 x64

    之前做了<Sublime Text 2 绿色汉化版 x64>,这些天抽空做了下 ST3 的汉化.. 果然我没有任何理由爱上 ST3,不仅pojie麻烦,而且汉化更麻烦,菜单字符长度做了限制 ...

  2. html5 canvas创建阴影

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. es6笔记(2) let 和 const

    let命令 用来声明一个变量,和var非常类似 1.使用let声明的变量,所声明的变量只在命令所在的代码块中有效 { let a = 1; console.log(a); // 这里是可以使用的 } ...

  4. grep 正则表达

    常见的 grep 正则表达参数 -c # 显示匹配到得行的数目,不显示内容 -h # 不显示文件名 -i # 忽略大小写 -l # 只列出匹配行所在文件的文件名 -n # 在每一行中加上相对行号 -s ...

  5. 基于Window10搭建android开发环境

    一.安装JDK 1.下载(网页链接) 2.双击安装文件进行安装,安装在合适目录,例如:D:\Java\jdk1.8.0_201与D:\Java\jre1.8.0_201 3.设置环境变量 3.1.JA ...

  6. Java Service Wrapper将java程序设置为服务

    有时候我们希望我们java写的程序作为服务注册到系统中,Java Service Wrapper(下面简称wrapper)是目前较为流行的将Java程序部署成Windows服务的解决方案, 本文将讨论 ...

  7. 二维码扫描开源库ZXing定制化【转】

    转自:http://www.cnblogs.com/sickworm/p/4562081.html 最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. ...

  8. Java中类与类的关系

    在java中类和类的关系大致分三种:泛化.关联.依赖. 1. 泛化(Generalization) "XX是一个XX"关系(is a),通常使用的关键词为 extends.impl ...

  9. PHP获取客户端的IP地址

    首先我们来了解相关变量的含义: $_SERVER['REMOTE_ADDR']:浏览当前页面的用户计算机的ip地址 $_SERVER['HTTP_CLIENT_IP']:客户端的ip $_SERVER ...

  10. Linix下修改mysql服务器编码

    1. 找到mysql的配置文件,拷贝到etc目录下,第一步很重要 把/usr/share/doc/mysql-server-5.1.52/my-large.cnf 复制到 /etc/my.cnf 即用 ...