1 序言——为什么折腾Google Test

  被逼无奈的。

  最近研究google开源的基于列存储的数据库查询引擎supersonic源码。初略的浏览了一遍代码,竟然没有main函数,顿时惊讶的目瞪口呆呀。对于习惯了从main函数开始,一行一行跟代码的程序猿,只觉得无从下手了。看了看源码中的README,supersonic提供的是数据库查询引擎的API,不是完整的系统,无法直接运行,也就不提供main函数了,但是可以通过test/guide目录下的测试用例开始学习supersonic提供的丰富的API。supersonic的API都被封装在Google Test中进行测试,到这引出了本文的主角Google Test。

  先来看一眼Google Test的大致轮廓。

// Tests negative input.
TEST(IsPrimeTest, Negative) {
// This test belongs to the IsPrimeTest test case. EXPECT_FALSE(IsPrime(-));
EXPECT_FALSE(IsPrime(-));
EXPECT_FALSE(IsPrime(INT_MIN));
}

2 下载Google Test源码

  Goole Test是开源工程,可以直接在google code 上下载。下载地址 https://code.google.com/p/googletest/

3 多种编译方式

  Google Test是跨平台的,提供了多种编译的方式。不同的平台下的工程文件放在不同的文件夹下,在msvc目录下提供了windows下的vs工程文件,xcode目录下支持mac的工程文件,还可以通过cmake编译,也有configure编译。也可以直接使用g++编译。

  g++编译命令如下

g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \
-pthread -c ${GTEST_DIR}/src/gtest-all.cc
ar -rv libgtest.a gtest-all.o

其中,GTEST_DIR 是项目的根目录。首先,将src/gtest-all.cc 编译成.o文件,然后,将其进行打包成一个静态链接库。接下来,可以加入自己写的单元测试文件。

  g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \
-o your_test

编译完成,生成可以运行的your_test程序,现在可以运行自己写的单元测试程序了。运行实例如下:

Running main() from gtest_main.cc
[==========] Running tests from test cases.
[----------] Global test environment set-up.
[----------] tests from FactorialTest
[ RUN ] FactorialTest.Negative
[ OK ] FactorialTest.Negative ( ms)
[ RUN ] FactorialTest.Zero
[ OK ] FactorialTest.Zero ( ms)
[ RUN ] FactorialTest.Positive
[ OK ] FactorialTest.Positive ( ms)
[----------] tests from FactorialTest ( ms total) [----------] tests from IsPrimeTest
[ RUN ] IsPrimeTest.Negative
[ OK ] IsPrimeTest.Negative ( ms)
[ RUN ] IsPrimeTest.Trivial
[ OK ] IsPrimeTest.Trivial ( ms)
[ RUN ] IsPrimeTest.Positive
[ OK ] IsPrimeTest.Positive ( ms)
[----------] tests from IsPrimeTest ( ms total) [----------] Global test environment tear-down
[==========] tests from test cases ran. ( ms total)
[ PASSED ] tests.

4 通过Makefile编译

  在make目录下,有Google Test提供的Makefile文件,可以简单的修改此Makefile文件,运行我们自己写的单元测试用例。在此过程中一般需要三个文件,

sample.h            //待测试函数的头文件

sample.cc            //待测试的函数体

sample_unittest.cc        //单元测试用例

编写单元测试用例sample_unittest.cc只需要三步,

第一步,包含需要的头文件,包括自定义的待测试函数以及gtest.h

#include "sample1.h"
#include "gtest/gtest.h"

第二步,使用TEST宏定义来定义测试用例

// Tests factorial of positive numbers.
TEST(FactorialTest, Positive) {
EXPECT_EQ(, Factorial());
EXPECT_EQ(, Factorial());
EXPECT_EQ(, Factorial());
EXPECT_EQ(, Factorial());
}

TEST宏定义有两个参数,测试用例的名字FactorialTest和测试名Positive。宏定义的函数体内部是测试的逻辑。

第三步,调用 RUN_ALL_TESTS() 执行所有的测试用例。

文件准备好之后,可以修改Makefile文件了。

GTEST_DIR = ..
USER_DIR = ../..
TESTS = merge_lists_unittest merge_lists.o : $(USER_DIR)/merge_lists.cc $(USER_DIR)/merge_lists.h $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/merge_lists.cc merge_lists_unittest.o : $(USER_DIR)/merge_lists_unittest.cc \
$(USER_DIR)/merge_lists.h $(GTEST_HEADERS)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/merge_lists_unittest.cc merge_lists_unittest : merge_lists.o merge_lists_unittest.o gtest_main.a
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@

GTEST_DIR:Google Test的工程目录

USER_DIR: 带测试的函数的文件目录

Google Test Frame 简单使用例子的更多相关文章

  1. 简介:google ctemplate:简单易用的文字模板(转载)

    转自:http://blog.csdn.net/aladdina/article/details/4531736 CTemplate 是一个简单实用.功能强大的文字模板(template langua ...

  2. 简单的例子了解自定义ViewGroup(一)

    在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...

  3. CSharpGL(1)从最简单的例子开始使用CSharpGL

    CSharpGL(1)从最简单的例子开始使用CSharpGL 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...

  4. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  5. IE内嵌google chrome frame解决浏览器兼容问题

    IE内嵌google chrome frame解决浏览器兼容问题  http://www.cnblogs.com/xwdreamer/archive/2013/12/17/3477776.html 参 ...

  6. Spring-Context之一:一个简单的例子

    很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...

  7. C#调用存储过程简单完整例子

    CREATE PROC P_TEST@Name VARCHAR(20),@Rowcount INT OUTPUTASBEGIN SELECT * FROM T_Customer WHERE NAME= ...

  8. 关于apriori算法的一个简单的例子

    apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表 ...

  9. 为什么C语言在2013年仍然很重要:一个简单的例子

    附注:在最初的文章里,我没说明进行模2^64的计算——我当然明白那些不是“正确的”斐波那契数列,其实我不是想分析大数,我只是想探寻编译器产生的代码和计算机体系结构而已. 最近,我一直在开发Dynvm— ...

随机推荐

  1. 数据中心基础设施自动化运维之puppet专项

    http://forge.puppetlabs.com/treydock/yum_cron  [puppet功能扩展forge] http://docs.puppetlabs.com/referenc ...

  2. 坑爹的IE quirk模式【转】

    调试一个页面,ie下面页面css样式很是奇怪,各种失效.找了半天原因不知道怎么回事.最后在调试工具中发现,文档模式为quirk,改成别的(IE 7|8|9)正常. 为什么会自动选择此文档模式呢? 先看 ...

  3. CMD-CMD命令之新建一个用户!

    1>>>>>> 新建管理员账号: net user net user xxxxx 123 /add net localgroup administrators xx ...

  4. oc学习之路----代理模式2-使用步骤

    之前已经写过一个个人关于代理模式的一些看法,现在就来总结一下使用代理模式的步骤吧. 1.先搞清楚谁是谁的代理(delegate) ● 2.定义代理协议,协议名称的命名规范:控件类名 + Delegat ...

  5. php数组相加 两个数组键名相同 后者不能覆盖前者

    array(“a”)+array(“b”)结果还是array(“a”) array(“a”)+array(“b”)的结果是 array(“a”) 因为,它们等效于array(“0″=>”a”)+ ...

  6. 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位

     文件正在上传的转圈圈gif图片  一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...

  7. IOS开发之TableView替换默认的checkmark为自定义图像

    直接上代码: On cellForRowAtIndexPath: UIButton*button =[UIButton buttonWithType:UIButtonTypeCustom];CGRec ...

  8. Oracle Linux 6.3下安装Oracle 11g R2(11.2.0.3)

    本文主要描写叙述了在Oracle Linux 6.3下安装Oracle 11gR2(11.2.0.3).从Oracle 11g開始,Oracle官方站点不再提供其Patch的下载链接,须要使用Meat ...

  9. jquery选择器及效率问题

    $('p2') //选择名字 $('.class') //选择class $('#id') //选择id $('#id li') //所有id=”id”标签内的li标签 $(“#id”).find(“ ...

  10. careercup-递归和动态规划 9.6

    9.6 实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对). 类似leetcode:Generate Parentheses 解法: 从头开始构造字符串,从而避免出现重复字符串.在这个解法 ...