使用gtest(googletest)进行c++单元测试
这是系列文章的第三篇,前两篇https://www.cnblogs.com/gaopang/p/11243367.html和https://www.cnblogs.com/gaopang/p/11588683.html.
为了保证软件质量,除去使用gdb进行事后调试,以及使用sanitize进行必要的提示以外,再就是单元测试了. Sanitize提供了关键性问题的提示,gdb提供了运行期间的错误解决途径,单元测试则是设计途中设置的一些规则,提供了实现后检验成果的依据.
谷歌出品了一个gtest,boost也有一个boost单元测试.我这里介绍gtest.废话不多说了.下边言归正传
安装
在vcpkg帮助下安装gtest非常的简单.
输入指令vcpkg install gtest,等待它安装完毕,然后就可以使用了.安装成功提示如下

在vcpkg的帮助下,安装一个依赖包就是如此简单.
至于如何安装vcpkg,请参照我第一篇.
使用gtest
我打算从头建立一个gtest项目,系列文章中的第一篇已经介绍了如何使用vcpkg+cmake+clion组织项目,这里简单提提.项目建立好后,应该先去设置以下项目属性File-->settings

如上图红框处,先设置Deployment(目的是设置好远程主机),再设置Toolchains(目的是让clion发现远程主机里安装的各种工具),再设置CMake(主要设置Cmake options: -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake,目的是为了让cmake和vcpkg联动,注意CMAKE_TOOLCHAIN_FILE指向自己机器的vcpkg.cmake文件.)
好了,我目的是为了建立如下目录结构,以及它们的cmakelists.txt文件的主要功能.

目录结构如下,其中src是项目源码的主目录,而test是测试的主目录.cmake-build-debug-xxx是clion生成的构建目录,cmake使用它进行缓存编译等操作,这里不用管它.
根目录的CMakeLists.txt:
cmake_minimum_required(VERSION 3.14) project(gtestsimple) set(CMAKE_CXX_STANDARD ) add_subdirectory(src) add_subdirectory(test)
src中的CMakeLists.txt内容如下
add_executable(gtest_simple_run main.cpp okkk.cpp okkk.h) add_library(gtest_simple_lib STATIC main.cpp okkk.cpp okkk.h )
src项目生成了一个gtest_simple_lib的静态库,目的是想着在test项目中链接的时候使用.
我打算针对src/okkk.cpp进行测试,它内容非常的简单的
int okkk::add(int x, int y) {
return x + y;
}
src其余的文件内容就忽略了.内容都非常的简单.
test项目的CMakefile.txt,内容如下
enable_testing()
find_package(GTest MODULE REQUIRED)#查找GTest
find_package(Threads)#查找Threads #一些调试信息
message(gtest_include_dir=${GTEST_INCLUDE_DIR})
message(gtest_library=${GTEST_LIBRARY})
message(threads=${CMAKE_THREAD_LIBS_INIT}) #包含GTest的库文件
include_directories(${GTEST_INCLUDE_DIR}) #包含src的项目文件
include_directories(../src) add_executable(gtest_simple_test main.cpp okkk-test.cpp) #链接gtest_simple_lib,这个是src项目生成的静态库
#链接${GTEST_LIBRARY},这个是gtest的库文件
#链接${CMAKE_THREAD_LIBS_INIT},即-lpthread
target_link_libraries(gtest_simple_test PUBLIC gtest_simple_lib ${GTEST_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) add_test(NAME gtest_simple_test COMMAND gtest_simple_test)
而test的测试也非常的简单,主体如下:
#include "gtest/gtest.h"
#include "okkk.h"
TEST(blaTest, test1) {
EXPECT_EQ (okkk::add(, ), );
EXPECT_EQ (okkk::add(, ), );
EXPECT_EQ (okkk::add(, ), );
}
注意到其中第三个是一个错误.
main.cpp内容
//
// Created by LaoGao on 2019/10/6.
// #include "gtest/gtest.h" int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
这样就可以测试了.截图如下.注意其中有一个是失败的.

Clion也可以和gtest相互整合

如上图所示,点击一下,它会把对应的测试运行一遍,并生成一个总览.
小结
在vcpkg和clion的帮助下,使用cmake变得简单,同时管理依赖库也变得异常简单.以上添加gtest就简单一步.
如果想在现有的项目上引入gtest也是可以办到的.主要是编辑test文件夹里的cmakelists.txt文件.完成4项主要内容
.找到gtest
.找到src
.组织test项目的文件
.其他杂项指令
以上4步骤中,最麻烦的是步骤2,而步骤2是每一个项目引入单元测试都会遇到的问题.可以说它是固有难度.所以抛开固有难度,将gtest引入到既有的项目,难度非常低.
gtest是一个非常好的单元测试库,具体的使用还是非常的复杂,单元测试在实践过程中非常的重要,但是单元测试最忌讳陷入使用勾股定理证明勾股定理的窘境.还有两个非常好的单元测试卡,boost.test和catch.这里就不做介绍了.
使用gtest(googletest)进行c++单元测试的更多相关文章
- 用gtest实现数据驱动的单元测试
//使用gtest进行数据驱动的单元测试 #include <gtest/gtest.h> #include <iostream> #include <vector> ...
- 使用googletest进行C++单元测试(Netbeans为例)
googletest设置步骤(Netbeans为例) 下载googletest [https://github.com/google/googletest],解压到<gtest_dir> ...
- 单元测试---googletest
单元测试概述 测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好的质量( Quality ),为所编写的功能代码编写适量的单元测试是十分必要的. 单元测试( Unit ...
- 如何用googletest写单元测试
http://www.uml.org.cn/c++/201203293.asp googletest是一个用来写C++单元测试的框架,它是跨平台的,可应用在windows.linux.Mac等OS平台 ...
- linux下使用gtest框架进行c/c++单元测试
linux下使用gtest框架进行c/c++单元测试 前言 关于此次开发工具的选择,因为我最近尝试在linux下使用vim进行c/c++编程,且之前已经对vim进行了相关的配置,所以这里应作业要求直接 ...
- gtest官方文档浅析
gtest的所有官方文档:http://code.google.com/p/googletest/w/list 选择单元测试框架的那些事 gtest不是唯一开源的单元测试框架,我也不觉得它是最好的单元 ...
- 玩转Google开源C++单元测试框架Google Test系列(转载)
越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...
- googletest基本测试宏
还不知道googletest基本使用方法的请参看前一篇blog 使用googletest进行C++单元测试 本篇仍然使用testStack测试文件进行测试,测试代码如下 #include <g ...
- 轻松编写 C++ 单元测试
单元测试概述 测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好的质量( Quality ),为所编写的功能代码编写适量的单元测试是十分必要的. 单元测试( Unit ...
随机推荐
- odoo12从零开始:二、个性化定制odoo12 之 创建数据库页面
剧情回顾 上一文章,我们已经成功运行了odoo12,并访问localhost:8069看到如下界面: 我们还没有创建数据库,但是我们发现,数据库管理页面的logo是odoo,数据库页面全是英文的,对于 ...
- CodeForces-714B-Filya and Homework+思路
Filya and Homework 题意: 给定一串数字,任选一个数a,把若干个数加上a,把若干个数减去a,能否使得数列全部相同: 思路: 我开始就想找出平均数,以为只有和偶数的可以,结果wa在 1 ...
- HDU-3400Line belt-三分再三分-求距离中要加esp
传送门:Line belt 参考:http://blog.csdn.net/hcbbt/article/details/39375763 题意:在一个平面途中,有一条路ab,还有一条路cd:假设在ab ...
- codeforces E. DNA Evolution(树状数组)
题目链接:http://codeforces.com/contest/828/problem/E 题解:就是开4个数组举一个例子. A[mod][res][i]表示到i位置膜mod余数是res的‘A’ ...
- CF985B Switches and Lamps 思维 第十九
Switches and Lamps time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Docker下使用disconf:细说demo开发
Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...
- windows update自启动解决方法
win+r打开运行,输入services.msc打开服务面板 找到Windows update服务,将常规选项卡的启动类型改为禁用,然后选择恢复选项卡,将三个失败选项都改为无操作 win+r打开运行, ...
- JavaScript 基础入门
JavaScript 基础入门 JavaScript 的组成 JS 由三部分组成,它们分别是:ECMAScript.DOM.BOM. ECMAScript 因为网景开发了JavaScrip ...
- maven引入jar包冲突问题
1.原因 使用maven过程中,经常会遇到jar包重复加载或者jar包冲突的问题,但是有些jar包是由于maven加载了其他jar包自动引入的,并非自己主动添加的,导致和自己添加的jar包版本冲突 举 ...
- FreeSql (十八)导航属性
导航属性是 FreeSql 的特色功能之一,可通过约定配置.或自定义配置对象间的关系. 导航属性有 OneToMany, ManyToOne, ManyToMany, OneToOne, Parent ...