简单易懂的单元测试框架-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的测试1TEST(checkOddTest, test1){  ASSERT_EQ(true, checkOdd(1));  ASSERT_EQ(true, checkOdd(11));}// 测试集checkOddTest的测试2TEST(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 GTestfind_package(GTest REQUIRED)include_directories(${GTEST_INCLUDE_DIRS})# Compile Objectadd_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的示例参考这里

(0)

相关推荐

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

    简介 事件机制用于在案例运行前后添加一些操作(相当于挂钩函数).目前,gtest提供了三种等级的事件,分别: 全局级,所有案例执行的前后 TestSuite级,某一个案例集的前后 TestCase级, ...

  • 千呼万唤始出来,叮咚,第八单元测试卷来了...

    随着时间的流逝,一个学期又快结束了.不知不觉又来到了最后一个单元了. 六年级语文第八单元测试卷,有需要的拿去打印给孩子练习.

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

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

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

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

  • windows下编译pcl-master源码(带GPU)

    参考博客 1.http://pointclouds.org/documentation/tutorials/compiling_pcl_windows.php#compiling-pcl-window ...

  • 手把手搭建RTSP流媒体服务器

    0.引言 本文主要讲解如何搭建RTSP流媒体服务器的过程,使用开源项目ZLMediaKit.通过这个开源项目,推RTSP流到服务器,然后拉流端可以拉取RTSP.RTMP等流. ZLMediaKit码云 ...

  • 玩转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,这里我们来做个小总结.单元测试介绍单元 ...

  • Unity(纯C语言单元测试框架!不是那个Unity3d)入门文档

    译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条.此为Unity手册的翻译,仅供学习交流使用,请勿用于商业用途. 翻译的资料是公开的,在docs/Un ...

  • Angular单元测试框架里API toHaveBeenCalledTimes的工作原理

    看这样一段代码: let spiedFirstFocusable = spyOn( keyboardFocusService, 'findFirstFocusable' ).and.returnVal ...