VS2010+gtest使用总结

C++项目开发离不开的测试框架—gtest! 刚刚啃掉这块骨头、总结一下以备后续使用。以下配置在VS2010+win7_64bit下:

下载配置流程

  1. 下载google test:https://github.com/google/googletest
  2. 解压,寻找目录msvc,直接运行sln文件,打开项目后直接编译全部,会在msvc目录下生成\gtest\Debug,找到gtestd.lib 和 gtest_maind.lib,接下来的使用参考如下两个方法:

简易配置–适用于小功能的验证

  1. 在vs2010中,新建一个C++控制台项目,例如 hello_gtest;
  2. 配置项目属性,在c/c++->常规->附加包含目录,输入 gtest下的include目录;在链接器->输入->附加依赖项,键入gtest下的\msvc\gtest\Debug\gtestd.lib以及gtest_maind.lib。
    在c/c++->代码生成->运行库,修改为“多线程调试(/mtd)” 。然后就可以正常编写代码了、

专业配置–适用于大项目的验证

为什么说这个方法适用于大项目呢?参考:http://www.cnblogs.com/SelaSelah/archive/2012/04/11/2442525.html >> 为了让测试和程序运行互不干扰,将【待测试模块】和【程序入口】分离为两个项目,而【待测试模块】的【单元测试】单独使用一个项目,这样程序和GTest都可以访问待测试模块,互不冲突可以并行工作。
这里主要介绍测试模块和其单元测试工程的创建,参考:http://blog.csdn.net/q_l_s/article/details/51783729 下面主要总结其思路。
3. 编写【待测试模块】的项目,主要接口包含到h中,设置项目的 c/c++代码生成–运行库 为MTD,常规配置类型输出为静态库.lib。
4. 编写【单元测试】项目,包含头文件目录为【待测试模块】目录+gtest的include目录;库目录增加 为【待测试模块】的debug目录+gtest生成的lib所在目录;连接器输入里面增加依赖项为gtestd.lib;gtest_maind.lib;以及【待测试模块】debug下生成的lib名称;设置项目的 c/c++代码生成–运行库 为MTD。
5. 编写单元测试用例和main函数,main函数主要执行testing::InitGoogleTest(&argc, argv);和return RUN_ALL_TESTS(); 然后就可以正常编写代码了、

代码编写入门:

参考: http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html

gtest单元测试的使用技巧:

(1)重载<<操作符,在用例执行失败时,输出一些提示信息。
EXPECT_EQ(value1, value2) << “output something”;
(2)布尔型系列断言
ASSERT_EQ, ASSERT_NE, ASSERT_LT, ASSERT_LE, ASSERT_GT, ASSERT_GE,
(3)字符串型系列断言
ASSERT_STRE, ASSERT_STRNE, ASSERT_STRCASEEQ, ASSERT_STRCASENE,
注:(2)(3)中所有ASSERT都对应类似的EXPECT断言;前者出错停止(比如指针为空必须停止的场景就必须用),后者出错继续运行(加快测试的覆盖率的时候用)!
(4)全局事件
实现一个继承testing::Environment的类,并实现SetUp和TearDown方法,
在这两个函数内可分别实现case执行前需要进行的全局初始化与case执行后需要进行的全局析构。
例如:执行用例前连接mysql,执行用例后断开mysql

class MysqlEnvironment : public testing::Environment
{
public:
    virtual void SetUp(){
        //mysql connect init
    }
    virtual void TearDown()
    {
        //mysql close uninit
    }
};

当然,main函数中要告诉gtest,添加这个全局事件。

int main(int argc, char** argv)
{
    testing::AddGlobalTestEnvironment(new MysqlEnvironment);
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

与全局事件类似的,还有TestSuite事件和TestCase事件。
(5)运行参数
main函数内执行了::testing::InitGoogleTest(&argc, argv); 可以看到,gtest是能够接收外界参数的。
参数说明:
–gtest_list_tests:只显示用例名称;
–gtest_filter:只执行匹配的用例,例如./foo_test –gtest_filter=foo,只执行用例名包含foo的用例,TEST(a,b)和TEST_F(a,b)这类的测试用例可以使用–gtest_filter=a.b 实现单个用例的测试。
–gtest_repeat:用例执行次数,例如./foo_test –gtest_repeat=1000 –gtest_filter=foo,foo这个用例执行1000次

注意事项

1)如果最终的程序需要debug则最好在gtest库生成的时候选择debug模式(通常建议这个方式)否则会出现如下错误:
error LNK2038: 检测到“”的不匹配项: 值“0”不匹配值“2”(.obj 中)

2)msvcprtd.lib(MSVCP100D.dll) : error LNK2005: “*“已经在 gtestd.lib(gtest-all.obj) 中定义的错误。
项目属性>>C/C++>>代码生成>>运行库。默认的Runtime Library是Multi-threaded Debug Dll(/MDd),而要编译login必须使用Multi-threaded Debug(因为jingle.lib等library都是lib格式,而不是dll格式)

3)VS解决方案下多个项目,切换启动项目的方法:项目名-右键-设为启动项目。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值