场景:

1. gtest作为C++的单元測试工具非常优秀了,它集成了非常多标准assert所没有的功能,比方让流程继续运行的EXPECT,仅仅測试特定測试用例的--gtest_filter,

输出xml文件的測试报告.

2.方便的FilePath对路径操作的类和Message设置Log级别,当然还有非常多方便的功能,比方环境变量设置.

using ::testing::internal::FilePath;
using ::testing::Message;

3.这里编写了一个vc2010简单的使用gtest的样例.使用gcc版本号请看,用的Makefile:

http://blog.csdn.net/infoworld/article/details/20457353

代码:

// test_gtest.cpp : 定义控制台应用程序的入口点。
//
// 在 googletest 中实现单元測试,可通过 ASSERT_* 和 EXPECT_*
// 断言来对程序执行结果进行检查。 ASSERT_* 版本号的断言失败时会产生致命失败,
// 并结束当前函数; EXPECT_* 版本号的断言失败时产生非致命失败,但不会中止当前函数。 // 因此, ASSERT_* 经常被用于兴许測试逻辑强制依赖的处理结果的断言,
// 如创建对象后检查指针是否为空,若为空,则兴许对象方法调用会失败;
// 而 EXPECT_* 则用于即使失败也不会影响兴许測试逻辑的处理结果的断言,
// 如某个方法返回结果的多个属性的检查。 #include "stdafx.h"
#include <iostream>
#include "gtest/gtest.h"
using ::testing::internal::FilePath;
using ::testing::Message; using namespace std;
//To generate the XML report, set the GTEST_OUTPUT environment variable or
//the --gtest_output flag to the string "xml:_path_to_output_file_",
//which will create the file at the given location.
//You can also just use the string "xml", in which case the output can be found in the test_detail.xml file in the current directory.
int main(int argc, _TCHAR* argv[])
{
testing::InitGoogleTest(&argc, argv); FilePath path(argv[0]);
FilePath currentDir = path.GetCurrentDir();
Message message("currentDir is: ");
message << currentDir.ToString();
GTEST_LOG_(INFO) << message ;
GTEST_LOG_(INFO) << ".............." ; RUN_ALL_TESTS();
system("pause");
return 0;
} TEST(test_main,TestBaseAssert)
{
cout << "TestBaseAssert" << endl;
ASSERT_TRUE(__LINE__);
EXPECT_TRUE(__LINE__); EXPECT_FALSE(true);
ASSERT_FALSE(false);
} TEST(test_main,TestBinaryAssert)
{
cout << "TestBinaryAssert" << endl;
const char* str = "11"; ASSERT_EQ(str,str);
EXPECT_EQ(false,0); ASSERT_NE(str,str+1);
EXPECT_NE(false,1); ASSERT_LT(str,str+1);
EXPECT_LT(0x1,0x2); ASSERT_LE(0x1,0x2);
EXPECT_LE(0x1,0x2); ASSERT_GT(0x2,0x1);
EXPECT_GT(0x2,0x1); ASSERT_GE(0x2,0x1);
EXPECT_GE(0x2,0x1);
} TEST(test_main,TestStrAssert)
{
cout << "TestStrAssert" << endl;
const char* str = "11ab";
std::string str2("11ab");
std::string str21("11aB");
//1.推断字符串是否相等.
ASSERT_STREQ(str,str2.c_str());
EXPECT_STREQ(str,str2.c_str()); //2.字符串大写和小写敏感
ASSERT_STRNE(str,str21.c_str());
EXPECT_STRNE(str,str21.c_str()); //3.字符串大写和小写不敏感
ASSERT_STRCASEEQ(str,str21.c_str());
EXPECT_STRCASEEQ(str,str21.c_str()); str21.append("!");
ASSERT_STRCASENE(str,str21.c_str());
EXPECT_STRCASENE(str,str21.c_str());
}

注意:

1. 使用gtest须要自己先编译,下载,我用的是1.5.0. 完整源文件放在csdn download里,下边看下载链接。

http://code.google.com/p/googletest

2. 假设须要自己编译gtest,在文件夹src\msvc下有sln文件, 默认编译出来的是静态库,貌似动态库使用上有问题.

3. 使用gtest时可能会报错

1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) 已经在 gtestd.lib(gtest.obj) 中定义
由于C/C++->代码生成->设置了"多线程调试 (/MTd)"
而项目使用的是 多线程调试 DLL (/MDd). 解决的方法:把測试项目改为 多线程调试 (/MTd) 就可以,注意一点,假设把gtest编译为 多线程调试 DLL (/MDd),按CTRL+F5会在
testing::InitGoogleTest(&argc, argv); 崩溃.我预计是共享执行时库DLL的做了某些加锁操作造成的.所以还是把測试项目exe改为
多线程调试 (/MTd)好点.

3.样例输出:

2.输出
C:\workspace\script-test\test_gtest\test_gtest\Debug>test_gtest --gtest_output=x
ml
[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from test_main
[ RUN ] test_main.TestBaseAssert
TestBaseAssert
c:\workspace\script-test\test_gtest\test_gtest\test_gtest\test_gtest.cpp(35): er
ror: Value of: true
Actual: true
Expected: false
[ FAILED ] test_main.TestBaseAssert (16 ms)
[ RUN ] test_main.TestBinaryAssert
TestBinaryAssert
[ OK ] test_main.TestBinaryAssert (16 ms)
[ RUN ] test_main.TestStrAssert
TestStrAssert
[ OK ] test_main.TestStrAssert (0 ms)
[----------] 3 tests from test_main (32 ms total) [----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (32 ms total)
[ PASSED ] 2 tests.
[ FAILED ] 1 test, listed below:
[ FAILED ] test_main.TestBaseAssert 1 FAILED TEST
请按随意键继续. . .

4.完整项目下载地址,项目里包括了编译好的gtestd.lib库和头文件,偷懒的童鞋能够直接先用着。

docs文件夹里有gtest的一些资料.

http://download.csdn.net/download/infoworld/7539997

[单元測试]_[VC2010使用gtest单元測试入门]的更多相关文章

  1. 谈谈单元測试之(二):測试工具 JUnit 3

    前言 上一篇文章<为什么要进行烦人的单元測试?>讨论了一下现阶段软件开发中,程序猿们測试情况的现状.这篇文章中,我打算介绍一下单元測试的工具(插件).而且推荐大家以后在开发中,真正的用上单 ...

  2. Swift - 可编辑表格样例(可直接编辑单元格中内容、移动删除单元格)

    (本文代码已升级至Swift3)   本文演示如何制作一个可以编辑单元格内容的表格(UITableView). 1,效果图 (1)默认状态下,表格不可编辑,当点击单元格的时候会弹出提示框显示选中的内容 ...

  3. StringGrid 实例4 本例功能: 1、给每个单元格赋值 2、调整当前单元格位置:上下左右;

    实例4 本例功能:1.给每个单元格赋值 2.调整当前单元格位置:上下左右: 运行效果图:

  4. 局域网网络性能測试方法HDtune 64K有缓存測速法,让你得知你的网络性能

    该方法能够有效測试出您的网络传输性能究竟有多高,该方法通用于有盘,无盘(系统虚拟盘) ,游戏虚拟盘,以及其它带有缓存功能的虚拟盘软件,可是由于每款软件的工作方式和原理都不仅同样,所以每款软件的測试结果 ...

  5. SWTBOK測试实践系列(1) -- 測试在项眼下期的评审投入划算吗?

    測试策略:静态測试还是动态測试? [对话场景] 成功公布某个软件版本号之后,项目团队召开了项目的经验教训总结大会.在会议期间,项目经理小项和測试经理小測进行了例如以下的对话: 小项:"小測, ...

  6. Excel_通过单元格的值来引用以单元格值命名的sheet

    1.通过单元格的值来引用以单元格值命名的sheet,在做多个类似sheet的统计结果时效率比较高 当一项测试中有很多个模块,每个模块中有很多条测试用例 将以上测试用例整理在Excel中,每个模块一个s ...

  7. Excel_单元格格式_查找替换、定位

    不重复! 显示格式:Ctrl+1 1,合并后居中,填充颜色,设置单元格边框,划斜线,格式刷(单击,双击) 2,单元格数字格式,格式不会改变值!自定义(编码规则) 4个 a :只显示星期:周+aaa:周 ...

  8. cmake,gtest单元测试程序

    参考:http://blog.csdn.net/stdcoutzyx/article/details/8284183 PROJECT (HELLO) SET(SRC_LIST main.c) MESS ...

  9. 2019北航oo课程第二单元作业总结..#_#..

    学习了之前在写代码是从来没有见过的多线程之后,便迎来了此次电梯作业.说实话,这次作业做得十分的辛苦,虽然在前三次作业中领悟到了java面向对象的精髓,但是再加上了多线程之后,又开始理不清思路,对自己的 ...

随机推荐

  1. 【Luogu】P1110报表统计(Splay)

    题目链接 SBT,我居然没看出来. 就是插入的时候考虑向平衡树里插两个差值,删一个差值. 另一个操作就是维护某元素和其前驱后继的差值最小值就行了. 然后Splay超时了…… (貌似Splay超时了之后 ...

  2. P2420 让我们异或吧 (树链剖分,异或前缀和)

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...

  3. api调用安全

    直接传 key 简直就是多此一举啊,随便监听一下网络就能把你的 key 盗走. 最简单的方式是使用签名,各大开放平台都是这样做的,性能好,安全性不错. 签名基本原理是通过 key/secret 的实现 ...

  4. java面试题之wait(),notify()和suspend(),resume()之间的区别

    wait()方法和notify()方法的区别: 这两个方法都是属于Object类中的,也是配套使用的,当调用这两个方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的wait()方法导致线 ...

  5. Spring之BeanFactory与ApplicationConText区别

    使用BeanFactory从xml配置文件加载bean: import org.springframework.beans.factory.xml.XmlBeanFactory; import org ...

  6. 瞄一眼LongAdder(jdk11)

    java版本11.0.1,感觉写得太水了,等心情好的时候再重新编辑一下. LongAdder中的核心逻辑主要由java.util.concurrent.atomic.Striped64维护,作为Str ...

  7. python 面向对象与类的基本知识

    一  什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...

  8. poj 3246 Game

    Game Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 2707   Accepted: 488 Description W ...

  9. Error querying database找不到数据库的错误可能发生的原因..

    这个问题纠结了大概两个小时.原因是这样的,我刚刚换了一台新的电脑,准备把以前电脑上自己搭建的小项目放到新电脑上面,用myeclipse引入项目之后,启动项目在浏览器跑起来.然后输入账号密码登录主页,报 ...

  10. Perl语言入门--3--perl的控制结构

    表达式真假值总结: 表达式不一定是逻辑表达式,但一定要得出真假值   假值:逻辑值为假 值为0 字符串为空 列表为空 undef 其他情况为真 1.if {} elsif {} else {} 2.u ...