简单易懂的单元测试框架-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的测试1TEST(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 GTestfind_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,实现其中的两个静态方法,

  1. SetUpTestCase()方法在该测试集的第一个TestCase之前执行
  2. 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 GTestfind_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 本文部分参考了这里

(0)

相关推荐

  • Ubuntu 20.04系统中VSCode CMake GTest实现自动化单元测试的详细方法

    严正声明:本文系作者davidhopper原创. 一般地讲,软件测试分为四个阶段:单元测试.集成测试.系统测试.验收测试.单元测试一般指对软件中的最小可测试单元进行检查和验证.最小可测试单元可以是指一 ...

  • 第二章 UT单元测试——GTest框架实例

    系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 文章目录 系列文章目录 前言 一.环境配置 二.使用步骤 1.添加待测源码 2.修改 ...

  • 简单易懂的单元测试框架-gtest(一)

    简介 gtest是google开源的一个单元测试框架,以其简单易学的特点被广泛使用.该框架以第三方库的方式插入被测代码中.同其他单元测试框架相似,gtest也通过制作测试样例来进行代码测试.同时,gt ...

  • 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)

    前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这 ...

  • 分享一个c语言单元测试框架

    来源:https://www.cnblogs.com/pingwen/p/9216004.html 1.简介 CuTest是一款微小的C语言单元测试框,非常简洁,只有2个文件,CuTest.c和CuT ...

  • 课件6——单元测试框架unittest

    单元测试框架unittest 单元测试 单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单 ...

  • Python单元测试框架-UnitTest以及测试报告

    时间主题9.4(周三)20:00python单元测试框架 在周三的公众号文中,芒果给大家提前剧透了分层自动化测试过程中最重要的一环--单元测试.晚上的测试运维直播课程中,芒果带着大家一起了解了Pyth ...

  • Python单元测试框架覆盖率-Coverage

    时间主题9.18(周三)20:00自动化测试框架搭建 在之前的公开课跟公众号文中,我们提到了单元测试覆盖率,今天我们一起来做个小总结. 覆盖率介绍首先来看看什么是单元测试覆盖率:覆盖率是用来衡量单元测 ...

  • 代码质量保证-单元测试框架pytest

    时间主题4.1(周三)20:00单元测试框架-pytest 在这周三的测试运维试听课程中,芒果给大家介绍了一个非常好用的python单元测试框架--pytest,这里我们来做个小总结.单元测试介绍单元 ...

  • 34 | 投资的框架之二

    ​破竹的朋友,你好,我是六土,欢迎来到"铸一池 保一生"投资课. 上节课我们分享了投资框架就是投资体系的骨架和树干,是为了最大程度的降低市场和个人干扰导致的愚蠢行为.其四个基础维度 ...

  • STUtility || 空间转录组多样本分析框架(二)

    男, 一个长大了才会遇到的帅哥, 稳健,潇洒,大方,靠谱. 一段生信缘,一棵技能树. 生信技能树核心成员,单细胞天地特约撰稿人,简书创作者,单细胞数据科学家. 我们在上一篇文章 STUtility | ...