简单易懂的单元测试框架-gtest(一)
简介
gtest是google开源的一个单元测试框架,以其简单易学的特点被广泛使用。该框架以第三方库的方式插入被测代码中。同其他单元测试框架相似,gtest也通过制作测试样例来进行代码测试。同时,gtest还支持通过事件机制为这些测试样例添加不同级别的挂钩函数。
gtest安装
在ubuntu中安装gtest的指令如下,该指令包含了下载源码、编译和安装的过程:
sudo apt-get install libgtest-dev
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
sudo cp *.a /usr/lib
由于下载的gtest是源文件,所需要自己编译成库文件(静态库),再复制到用户库目录下。在程序的链接阶段,这些静态库中的相应函数会修改后插入到程序中(这里的修改指进行地址替换)。
Hello World
这里将演示一个基础的单元测试例子。这里的被测试函数为checkOdd。我们创建一个测试集,测试集合包含了两个小测试,分别测试了checkOdd函数是否能正确判断奇数。每个小测试内部包含几个断言语句。
/* 一个简单的单元测试示例 */
#include <gtest/gtest.h>
// 待测函数,作用是检查输入是否为奇数
bool checkOdd(int a){
return a%2==1;
}
// 测试集checkOddTest的测试1
TEST(checkOddTest, test1){
ASSERT_EQ(true, checkOdd(1));
ASSERT_EQ(true, checkOdd(11));
}
// 测试集checkOddTest的测试2
TEST(checkOddTest, test2){
ASSERT_EQ(false, checkOdd(2));
ASSERT_EQ(false, checkOdd(12));
}
int main(int argc, char **argv){
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
上述代码就构成了一个完整的单元测试程序。为了编译上述代码,需要将gtest的头文件目录和库文件位置加入g++的搜索目录中。本文制作了一个cmake配置文件CMakeLists.txt来完成上述过程,内容如下,
cmake_minimum_required(VERSION 2.6)
# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
# Compile Object
add_executable(runTests test.cc)
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)
add_custom_command(TARGET runTests
POST_BUILD
COMMAND ./runTests
)
上述代码除了配置编译的搜索目录外,还添加了一个客制命令。这里的add_custom_command为目标runTests添加了一个客制命令,其作用是在runTests构建后执行命令"./runTests"。这条命令作用在于,当单元测试编译结束时,顺便就运行这个单元测试程序。是一个方便的小技巧。运行如下指令,开始编译和单元测试过程:
cmake CMakeLists.txt
make
运行结果为,
Scanning dependencies of target runTests
[ 50%] Building CXX object CMakeFiles/runTests.dir/test.cc.o
[100%] Linking CXX executable runTests
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from checkOddTest
[ RUN ] checkOddTest.test1
[ OK ] checkOddTest.test1 (0 ms)
[ RUN ] checkOddTest.test2
[ OK ] checkOddTest.test2 (0 ms)
[----------] 2 tests from checkOddTest (0 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (0 ms total)
[ PASSED ] 2 tests.
[100%] Built target runTests
注意到,代码的前半部分输出是编译单元测试程序,后半部分输出则是单元测试结果。从结果可以看到我们运行了一个单元测试用例,该测试用例的两个小测试都成功通过。
到这里展示的是一个简单demo,在接下来将展示实际开发过程中经常使用的事件机制。
其他
Gcov & Lcov是用于检查代码覆盖率的工具,貌似还可以与gtest结合使用。
Reference
[1] https://www.eriksmistad.no/getting-started-with-google-test-on-ubuntu/ HelloWorld的示例参考这里
简单易懂的单元测试框架-gtest(一)的更多相关文章
- 简单易懂的单元测试框架-gtest(二)
简介 事件机制用于在案例运行前后添加一些操作(相当于挂钩函数).目前,gtest提供了三种等级的事件,分别: 全局级,所有案例执行的前后 TestSuite级,某一个案例集的前后 TestCa ...
- Google单元测试框架gtest之官方sample笔记2--类型参数测试
gtest 提供了类型参数化测试方案,可以测试不同类型的数据接口,比如模板测试.可以定义参数类型列表,按照列表定义的类型,每个测试case都执行一遍. 本例中,定义了2种计算素数的类,一个是实时计算, ...
- Google单元测试框架gtest之官方sample笔记3--值参数化测试
1.7 sample7--接口测试 值参数不限定类型,也可以是类的引用,这就可以实现对类接口的测试,一个基类可以有多个继承类,那么可以测试不同的子类功能,但是只需要写一个测试用例,然后使用参数列表实现 ...
- Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试
sample 10 使用event listener监控Water类的创建和销毁.在Water类中,有一个静态变量allocated,创建一次值加一,销毁一次值减一.为了实现这个功能,重载了new和d ...
- C++单元测试框架gtest使用
作用 作为代码编码人员,写完代码,不仅要保证编译通过和运行,还要保证逻辑尽量正确.单元测试是对软件可测试最小单元的检查和校验.单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成 ...
- Google C++单元测试框架---Gtest框架简介(译文)
一.设置一个新的测试项目 在用google test写测试项目之前,需要先编译gtest到library库并将测试与其链接.我们为一些流行的构建系统提供了构建文件: msvc/ for Visual ...
- Google单元测试框架gtest之官方sample笔记1--简单用例
1.0 通用部分 和常见的测试工具一样,gtest提供了单体测试常见的工具和组件.比如判断各种类型的值相等,大于,小于等,管理多个测试的测试组如testsuit下辖testcase,为了方便处理初始化 ...
- Google C++单元测试框架GoogleTest(总)
之前一个月都在学习googletest框架,对googletest的文档都翻译了一遍,也都发在了之前的博客里,另外其实还有一部分的文档我没有发,就是GMock的CookBook部分:https://g ...
- Google C++单元测试框架GoogleTest---GTest的Sample1和编写单元测试的步骤
如果你还没有搭建gtest框架,可以参考我之前的博客:http://www.cnblogs.com/jycboy/p/6001153.html.. 1.The first sample: sample ...
随机推荐
- 使用JS+Three.js+Echart开发商场室内地图客流信息统计功能
现在的商场管理者在管理商场的同时面临着一些无法避免的问题比如:人员监管不到位.效率低下.商场同质化严重,人流量少等.发现了这些问题作为开发人员的我们怎能视而不见,我们的责任就是发现问题解决问题,提供更 ...
- Redis客户端——Jedis的使用
本文介绍基于Java语言的Redis客户端——Jedis的使用,包括Jedis简介.获取Jedis.Jedis直连.Jedis连接池以及二者的对比的选择. Jedis简介 Jedis 是 Redis ...
- ERP小金刚Pro专业大比拼: Dynamics,NetSuite和Odoo
前言 在过去的15年中,新技术推动了大大小企业的重新思考他们的流程管理涉及不断变化的业务所创造的新动态景观.实施ERP是许多企业为帮助组织而采取的措施并优化他们开展业务的方式.然而,市场上目前有许多商 ...
- Windows Server 2016-图形化之客户端加域(一)
要使用域环境,您必须将计算机加入域.只有加入域的计算机才能使用域资源.在连接期间,将在域中创建一个计算机帐户,以便将计算机作为成员进行身份验证.前边两节我们写到Windows Server 2016- ...
- gulp+ThinkPHP配置
gulp+ThinkPHP配置 gulp+ThinkPHP配置 目录结构: html |-src 开发目录 |-Home 静态页面 |-Public 静态资源目录 |-dist 生产目录 |-Home ...
- 向MIP开源项目提交Issues
Issues 是 GitHub 管理需求,讨论技术方案的方式,附:官方解释.MIP 是在 GitHub 上的开源项目,也使用 Issues 来做任务管理. 一.Issues 在 MIP 项目中的应用 ...
- IM开发者的零基础通信技术入门(一):通信交换技术的百年发展史(上)
[来源申明]本文原文来自:微信公众号“鲜枣课堂”,官方网站:xzclass.com,原题为:<通信交换的百年沧桑(上)>,本文引用时已征得原作者同意.为了更好的内容呈现,即时通讯网在收录时 ...
- JavaSE:八种基本数据类型
变量: 程序用来存储数据的一块内存空间,程序在运行过程中可以对其存储的数据进行改变,所以叫做变量 常量:相对于变量来说,其值是不可改变的 整数类型(byte short int long) b ...
- Notepad++ 安装连接服务器的NppFTP插件
用Notepad++连接服务器,可以随时编辑一些文件不用特意下载.有时重做系统经常忘记一些插件备份到了哪.再此做个记录,方便重新安装. 下载完NppFTP插件,解压后将bin文件夹下的NppFTP.d ...
- 阿里ECS配置MSSQL远程连接的坑
mssql 2012 r2远程配置的相关文档有太多: 如:sql server2012 远程访问设置 这里不做远程配置的设置介绍.这篇随笔存在的意义在于,你除了要设置服务器,还需要到阿里云控制台设置安 ...