简单易懂的单元测试框架-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 ...
随机推荐
- MVC设计模式思想及简单实现
一.什么是MVC MVC即Model-View-Controller(模型-视图-控制器)是一种软件设计模式,最早出现在Smalltalk语言中,后被Sun公司推荐为Java EE平台的设计模式. M ...
- QT文件操作
/* 写文件 */ QFile file(filePath); bool bo = file.open(QIODevice::WriteOnly | QIODevice::Append); //qDe ...
- npm 模块化管理
我们要使用 npm 进行包管理,首先我们得安装 npm,怎么安装?其实只要你安装了 node,那便相当于安装了 npm: node下载地址:http://nodejs.cn/download/ 由于 ...
- CentOS_关机与重启命令详解
Linux centos关机与重启命令详解 Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过 ...
- Windows下docker的安装以及遇到的问题
最近因为业务的需要,需要在本地搭建服务环境测试,不想去安装各种软件,于是就想到了用docker来满足我的需要.由于第一次在Windows下安装(以前一直是在linux下使用,但由于内存等硬件的限制 ...
- 为什么腾讯有QQ,还要推出微信?
在微信刚出现时候,很多人奇怪,为什么腾讯有QQ,还要推出微信? 一开始,我也认为它与QQ没有什么区别.有这种看法,是因为绝大多数时候,我都仅仅只使用即时聊天功能,微信上有的语音.视频.文字等等,这些在 ...
- C# 三种打印方式含代码
一:C#代码直接打印pdf文件(打印质保书pdf文件) 引用: 代码注释很详细了. private void btn_pdf_Click(object sender, RoutedEventArgs ...
- 手把手安装Laravel框架(permissions扩展包)实现RBAC权限---以及一些安装时的ERROR
a.依赖管理工具,框架,环境 1.composer 2.laravel(我的是5.5) 3.PHP(我的7.2),MySql(我的5.7) b,安装 1.首先需要安装一个干净的 Laravel 项目, ...
- GlideDemo【Glide3.7.0版本的简单使用以及圆角功能】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo主要记录Glide3.7.0版本的简单运用和实现圆角方案. 效果图 代码分析 Glide的centerCrop()和fit ...
- React的入门知识与概念【1】
回顾在以往的项目开发中,从最初的使用的原生html+js+css+jquery开发,到后来随着项目功能的增加,也渐渐学习了Vue.js框架的开发,以及Vue.js的全家桶Axios,Vue-route ...