简单易懂的单元测试框架-gtest(二)
简介
事件机制用于在案例运行前后添加一些操作(相当于挂钩函数)。目前,gtest提供了三种等级的事件,分别:
- 全局级,所有案例执行的前后
- TestSuite级,某一个案例集的前后
- TestCase级,每一个案例的前后
不同等级的事件在影响不同的范围。
示例-全局级
全局级事件在所有案例执行的前后运行,制作该事件需要继承testing::Environment类,实现里面的SetUp和TearDown方法。为了模拟实际应用中的情况,下面的测试代码分为了三个文件,分别代表:全局级事件头文件(unit_test.h);全局级事件实现文件(unit_test.cc);具体的测试文件(test_main.cc)。测试代码如下,
/* 为单元测试设置全局事件 */
// unit_test.h
#ifndef UNIT_TEST_H_
#define UNIT_TEST_H_
#include <gtest/gtest.h>
class FooEnvironment: public testing::Environment{
public:
void SetUp();
void TearDown();
};
#endif
/* 为单元测试设置全局事件 */
// unit_test.cc
#include <iostream>
#include "unit_test.h"
void FooEnvironment::SetUp(){
std::cout<<"FooEnvironment::SetUp"<<std::endl;
}
void FooEnvironment::TearDown(){
std::cout<<"FooEnvironment::TearDown"<<std::endl;
}
/* 单元测试 */
// test_main.cc
#include "unit_test.h"
bool checkOdd(int a){
return a%2==1;
}
// 测试集checkOddTest的测试1
TEST(checkOddTest, test1){
ASSERT_EQ(true, checkOdd(1));
ASSERT_EQ(true, checkOdd(11));
}
int main(int argc, char **argv){
testing::AddGlobalTestEnvironment(new FooEnvironment);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
上述代码是一个简单的全局级事件模板,大部分时候我们都可以采用类似的结构在实际工程中添加单元测试程序。其中,SetUp方法在所有案例前执行,TearDown方法在所有案例后执行。
这份代码的编译同样需要gtest的头文件和库文件,所以采用了与简介中相同的方案来配置编译环境。cmake文件如下,
cmake_minimum_required(VERSION 2.6)
# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(runTests test_main.cc
unit_test.cc)
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)
运行如下编译指令,可以获得单元测试程序,
cmake CMakeLists.txt
make
now,运行单元测试程序,结果如下,
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
FooEnvironment::SetUp
[----------] 1 test from checkOddTest
[ RUN ] checkOddTest.test1
[ OK ] checkOddTest.test1 (0 ms)
[----------] 1 test from checkOddTest (0 ms total)
[----------] Global test environment tear-down
FooEnvironment::TearDown
[==========] 1 test from 1 test case ran. (0 ms total)
[ PASSED ] 1 test.
可以看到,我们的单元测试程序汇报了单元测试的最终结果,包括:全局级事件的运行、测试样例的运行等等。
示例-TestSuite级
TestSuite级的事件覆盖范围相对要小一些,只是覆盖几个具备相同事件需求的测试样例,该事件需要继承自testing::Test,实现其中的两个静态方法,
- SetUpTestCase()方法在该测试集的第一个TestCase之前执行
- TearDownTestCase()方法在该测试集的最后一个TestCase之后执行
下列示例代码采用了与全局级事件相似的组织结构。测试代码如下,
/* test_suit.h */
/* 测试TestSuite事件 */
#ifndef TEST_SUITE_H_
#define TEST_SUITE_H_
#include <gtest/gtest.h>
class FooTest: public testing::Test{
protected:
static void SetUpTestCase();
static void TearDownTestCase();
// some expensive resource shared by all tests.
static int *p_;
};
#endif
/* test_suit.cc */
/* 测试TestSuite事件 */
#include <iostream>
#include "test_suit.h"
int* FooTest::p_ = nullptr;
void FooTest::SetUpTestCase(){
p_ = new int;
std::cout<<"FooTest::SetUpTestCase"<<std::endl;
}
void FooTest::TearDownTestCase(){
delete p_;
p_ = nullptr;
std::cout<<"FooTest::SetUpTestCase"<<std::endl;
}
/* test_main.cc */
/* 测试TestSuite事件 */
#include "test_suit.h"
bool isFoo(int data){
return data%2==1;
}
TEST_F(FooTest, test1){
ASSERT_EQ(true, isFoo(3));
ASSERT_EQ(false, isFoo(4));
ASSERT_EQ(true, isFoo(2));
}
int main(int argc, char **argv){
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
使用的编译文件为,
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_STANDARD 11)
# Locate GTest
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(runTests test_main.cc
test_suit.cc)
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread)
使用如下指令编译,
cmake CMakeLists.txt
make
当编译好单元测试程序后,运行该程序,结果如下,
blue@blue-Aspire-4741:~/lab/gtest/event/suite$ ./runTests
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from FooTest
FooTest::SetUpTestCase
[ RUN ] FooTest.test1
/home/blue/lab/gtest/event/suite/test_main.cc:11: Failure
Value of: isFoo(2)
Actual: false
Expected: true
[ FAILED ] FooTest.test1 (0 ms)
FooTest::SetUpTestCase
[----------] 1 test from FooTest (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[ PASSED ] 0 tests.
[ FAILED ] 1 test, listed below:
[ FAILED ] FooTest.test1
1 FAILED TEST
单元测试运行结果的展示也几乎一样。
示例-TestCase级
该部分与上述两部分非常相似,仅仅是继承类与重载函数稍有不同。
Reference
[1] http://www.cnblogs.com/coderzh/archive/2009/04/06/1430396.html 本文部分参考了这里
简单易懂的单元测试框架-gtest(二)的更多相关文章
- 简单易懂的单元测试框架-gtest(一)
简介 gtest是google开源的一个单元测试框架,以其简单易学的特点被广泛使用.该框架以第三方库的方式插入被测代码中.同其他单元测试框架相似,gtest也通过制作测试样例来进行代码测试.同 ...
- 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 ...
- 聊聊 Python 的单元测试框架(二):nose 和它的继任者 nose2
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 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 ...
随机推荐
- Web前后端分离
第一篇博客:见谅 用自己的通俗语言讲web工程的前后端分离: 只是从自己的角度去分析,我眼中的前后端分离(可能不对) 首先要明白我们服务器和浏览器之前传输和接受的是什么: 静态文件(html,css, ...
- Android音视频之AudioRecord录音(一)
在音视频开发中,录音当然是必不可少的.首先我们要学会单独的录音功能,当然这里说的录音是指用AudioRecord来录音,读取录音原始数据,读到的就是所谓的PCM数据.对于录音来说,最重要的几个参数要搞 ...
- Java对象引用/JVM分级引用——强引用、软引用、弱引用、虚引用
无论是通过引用计数法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判断对象是否存活都与“引用”有关, 相关资料:如何判断对象是否存活/死去 那么引用究竟是什么?让我们一起来看一下 ...
- eShopOnContainers 知多少[4]:Catalog microservice
引言 Catalog microservice(目录微服务)维护着所有产品信息,包括库存.价格.所以该微服务的核心业务为: 产品信息的维护 库存的更新 价格的维护 架构模式 如上图所示,本微服务采用简 ...
- Java面向对象概述及三大特征(封装,继承和多态)
一.面向对象思想 Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象! 它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计.面向对象程序的最小单元是类,类代表了客观世界 ...
- Hadoop系列009-NameNode工作机制
本人微信公众号,欢迎扫码关注! NameNode工作机制 1 NameNode & SecondaryNameNode工作机制 1.1 第一阶段:namenode启动 1)第一次启动namen ...
- CentOS7 安装mysql 5.7
一.安装准备 检查系统中是否安装了mysqlrpm -qa|grep mysql如果有安装mysql,则需要先卸载之前安装的mysqlyum -y remove mysql然后再查看mysql是否都卸 ...
- [ZJOI2007] 捉迷藏
idea1 可能会死掉的想法:考虑点分治维护每个分治中心x到达分治块内的个点距离,具体是用堆维护分治快内的x的儿子y到y的子树内的所有点距离(记为C[y]),取所有C[y]的top+e(x,y)放入x ...
- PMBook - 以考PMP为项目,整理项目章程
一.以考PMP为项目,整理项目章程 二.PMBook 制定项目章程:输出 参考资料:<PMBook第六版> 作 者: Jackson0714 出 处:http://www.cnblogs. ...
- ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1
一.前言 最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知 ...