这是系列文章的第三篇,前两篇https://www.cnblogs.com/gaopang/p/11243367.htmlhttps://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++单元测试的更多相关文章

  1. 用gtest实现数据驱动的单元测试

    //使用gtest进行数据驱动的单元测试 #include <gtest/gtest.h> #include <iostream> #include <vector> ...

  2. 使用googletest进行C++单元测试(Netbeans为例)

    googletest设置步骤(Netbeans为例) 下载googletest [https://github.com/google/googletest],解压到<gtest_dir> ...

  3. 单元测试---googletest

    单元测试概述 测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好的质量( Quality ),为所编写的功能代码编写适量的单元测试是十分必要的. 单元测试( Unit ...

  4. 如何用googletest写单元测试

    http://www.uml.org.cn/c++/201203293.asp googletest是一个用来写C++单元测试的框架,它是跨平台的,可应用在windows.linux.Mac等OS平台 ...

  5. linux下使用gtest框架进行c/c++单元测试

    linux下使用gtest框架进行c/c++单元测试 前言 关于此次开发工具的选择,因为我最近尝试在linux下使用vim进行c/c++编程,且之前已经对vim进行了相关的配置,所以这里应作业要求直接 ...

  6. gtest官方文档浅析

    gtest的所有官方文档:http://code.google.com/p/googletest/w/list 选择单元测试框架的那些事 gtest不是唯一开源的单元测试框架,我也不觉得它是最好的单元 ...

  7. 玩转Google开源C++单元测试框架Google Test系列(转载)

    越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...

  8. googletest基本测试宏

    还不知道googletest基本使用方法的请参看前一篇blog  使用googletest进行C++单元测试 本篇仍然使用testStack测试文件进行测试,测试代码如下 #include <g ...

  9. 轻松编写 C++ 单元测试

    单元测试概述 测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好的质量( Quality ),为所编写的功能代码编写适量的单元测试是十分必要的. 单元测试( Unit ...

随机推荐

  1. 第6章 面向对象的程序设计 6.1 javascript对象

    ECMA-262 把对象定义为: “无序属性的集合, 其属性可以包含基本值. 对象或者函数. ” 严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到 ...

  2. cogs1709. [SPOJ 705] 不同的子串(后缀数组

    http://cogs.pro:8080/cogs/problem/problem.php?pid=vyziQkWaP 题意:给定一个字符串,计算其不同的子串个数. 思路:ans=总共子串个数-相同的 ...

  3. UVA - 10462-Is There A Second Way Left? Kruskal求次小生成树

    UVA - 10462 题意: 求次小生成树的模板题,这道题因为有重边的存在,所以用kruskal求比较好. #include <iostream> #include <cstdio ...

  4. 最短路 dijkstra+优先队列+邻接表

    http://acm.hdu.edu.cn/showproblem.php?pid=2544 #include<iostream> #include<queue> #inclu ...

  5. Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树

    Given a sequence of integers a1, a2, ..., an and q pairs of integers (l 1, r1), (l2, r2), ..., (lq, ...

  6. codeforces 764 C. Timofey and a tree(dfs+思维)

    题目链接:http://codeforces.com/contest/764/problem/C 题意:给出一个树,然后各个节点有对应的颜色,问是否存在以一个点为根节点子树的颜色都一样. 这里的子树颜 ...

  7. 2017 ACM/ICPC Asia Regional Qingdao Online 1003 The Dominator of Strings hdu 6208

    The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  8. equals、==、hashCode

    equals和==的区别 ==主要用来比较基本数据类型,而equal主要用来比较对象是否相等.equal是Object的方法. 如果两者都用来比较对象的相等性,那么如果两个引用地址相同,那么==就返回 ...

  9. Linux变量替换技术

    1.1.1   ${value:-word} 如果变量value没有定义,则返回word,如果已经赋值则返回value变量的值 result=${jimyy:-UNSET} echo $result ...

  10. 漫谈Java中的OOPS

    什么是OOPS? 面向对象编程是一种编程概念,其工作原理是对象是程序中最重要的部分.它允许用户创建他们想要的对象,然后创建处理这些对象的方法.操作这些对象以获得结果是面向对象编程的目标. 面向对象编程 ...