zoukankan      html  css  js  c++  java
  • 使用gtest对DLL工程进行单元测试的实践

    前言

    关于单元测试的重要性、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模式下才会有效。

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

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

     1 #include "stdafx.h"
     2 
     3 #ifdef GTEST_DEBUG      // 这段代码只能在Gtest_Debug模式下运行
     4 
     5 int add(int a, int b)
     6 {
     7     return a + b;
     8 }
     9 
    10 TEST(fun, add)
    11 {
    12     EXPECT_EQ(1, add(2, -1));
    13     EXPECT_EQ(5, add(2, 3));
    14 }
    15 
    16 int main(int argc, wchar_t* argv[])
    17 {
    18     testing::InitGoogleTest(&argc, argv);
    19     return RUN_ALL_TESTS();
    20 }
    21 
    22 #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

  • 相关阅读:
    XSS漏洞攻击
    String 是值类型还是引用类型
    客户端验证不能代表服务器端验证
    PowerDesigner参照(Reference)笔记
    LazyAllocate(缓分配)与PreAllocate(预分配)
    我在delphi7下调用微软的Web Services的心得.(可以返回数据集)
    C Dungeon Master
    TimeQuest笔记
    XPStyle Button
    对XML文件的CRUD(添加,读取,搜索,修改,删除)的例子
  • 原文地址:https://www.cnblogs.com/qinwanlin/p/6574573.html
Copyright © 2011-2022 走看看