Google Test Frame 简单使用例子
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 简单使用例子的更多相关文章
- 简介:google ctemplate:简单易用的文字模板(转载)
转自:http://blog.csdn.net/aladdina/article/details/4531736 CTemplate 是一个简单实用.功能强大的文字模板(template langua ...
- 简单的例子了解自定义ViewGroup(一)
在Android中,控件可以分为ViewGroup控件与View控件.自定义View控件,我之前的文章已经说过.这次我们主要说一下自定义ViewGroup控件.ViewGroup是作为父控件可以包含多 ...
- CSharpGL(1)从最简单的例子开始使用CSharpGL
CSharpGL(1)从最简单的例子开始使用CSharpGL 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- IE内嵌google chrome frame解决浏览器兼容问题
IE内嵌google chrome frame解决浏览器兼容问题 http://www.cnblogs.com/xwdreamer/archive/2013/12/17/3477776.html 参 ...
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- C#调用存储过程简单完整例子
CREATE PROC P_TEST@Name VARCHAR(20),@Rowcount INT OUTPUTASBEGIN SELECT * FROM T_Customer WHERE NAME= ...
- 关于apriori算法的一个简单的例子
apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表 ...
- 为什么C语言在2013年仍然很重要:一个简单的例子
附注:在最初的文章里,我没说明进行模2^64的计算——我当然明白那些不是“正确的”斐波那契数列,其实我不是想分析大数,我只是想探寻编译器产生的代码和计算机体系结构而已. 最近,我一直在开发Dynvm— ...
随机推荐
- Miller-Rabin素性测试(POJ3641)
一.概念引入 在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差, ...
- CF402E Strictly Positive Matrix 传递闭包用强连通分量判断
题目链接:http://codeforces.com/problemset/problem/402/E /**算法分析: 这道题考察了图论基本知识,就是传递闭包,可以构图用强联通分量来判断 */ #i ...
- c c++ 函数入口和出口的hook(gcc 编译选项),然后打印出函数调用关系的方法
GCC Function instrumentation机制可以用来跟踪函数的调用关系,在gcc中对应的选项为“-finstrument-functions”.可查看gcc的man page来获取更详 ...
- poj 3069 Saruman's Army (贪心)
简单贪心. 从左边开始,找 r 以内最大距离的点,再在该点的右侧找到该点能覆盖的点.如图. 自己的逻辑有些混乱,最后还是参考书上代码.(<挑战程序设计> P46) /*********** ...
- storm的特性
storm的特性 Storm 是一个开源的分布式实时计算系统,可以简单.可靠地处理大量的数据流. Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,每个 ...
- hdoj 1702 ACboy needs your help again!【数组模拟+STL实现】
ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- error C2589: “(”: “::”右边的非法标记 error C2059: 语法错误 : “::
1. 错误输出 ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2589: “(”: “::”右边的非法标记 ...
- cocos2d-x 的CCObject与autorelease 之深入分析
转自: http://blog.csdn.net/honghaier/article/details/8160519 CCObject.h: #ifndef __CCOBJECT_H__ #defin ...
- 远程使用Gpupdate(Hash,哈希)
function Start-GPUpdate { param ( [String[]] $ComputerName ) $code ...
- Linux系列:Ubuntu虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)
虚拟机里设置上网方式为NAT最方便,因为无需手动设置即可上网,但是NAT的上网方式默认是DHCP动态分配IP的,这意味着你每次重启虚拟机都 有不一样的IP地址,这对一般用户没任何问题.但是如果你的机子 ...