【CMake】gtest环境搭建与TDD入门(二)

2023-05-16

上一篇文章,我们介绍了CMake:传送门

这一篇文章我暂时不打算继续写CMake相关的东西了,转而写一个叫TDD的开发理论,当然,理论是需要实践支撑的,利用CMake,我简单搭了一个gtest环境。

准备

gtest

Gtest是一个跨平台的(Linux、Mac OS X、Windows、Cygwin、Windows CE and Symbian) C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。

简而言之:Gtest测试框架可以在不同平台上为编写C++测试。

可以从以下途径下载gtest:
GitHub:https://github.com/google/googletest
Gitee国内镜像:https://gitee.com/mirrors/googletest

将代码 git clone 到本地,接下来需要编译gtest动态链接库,进入项目文件夹下的googletest根目录,如下:

    Directory: D:\toolsSpace\googletest\googletest                                                                                              
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----    2022/9/17 星期六    19:46                bin
d----    2022/9/17 星期六    18:51                cmake
d----    2022/9/17 星期六    19:46                CMakeFiles
d----    2022/9/17 星期六    18:51                docs
d----    2022/9/17 星期六    18:51                include
d----    2022/9/17 星期六    19:46                lib
d----    2022/9/17 星期六    18:51                samples
d----    2022/9/17 星期六    18:51                src
d----    2022/9/17 星期六    18:51                test
-a---    2022/9/17 星期六    19:45           1609 cmake_install.cmake
-a---    2022/9/17 星期六    19:45          18571 CMakeCache.txt
-a---    2022/9/17 星期六    19:44          12322 CMakeLists.txt
-a---    2022/9/17 星期六    19:45           6889 Makefile
-a---    2022/9/17 星期六    18:51           9107 README.md

默认是不编译dll动态库的。修改这个目录下的CMakeLists.txt,找到下面这部分:

# These commands only run if this is the main project
if(CMAKE_PROJECT_NAME STREQUAL "gtest" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution")

  # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
  # make it prominent in the GUI.
  option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)

else()

  mark_as_advanced(
    gtest_force_shared_crt
    gtest_build_tests
    gtest_build_samples
    gtest_disable_pthreads
    gtest_hide_internal_symbols)

endif()

修改option后面的OFFON,代表开启了编译DLL动态库。

Windows默认使用MSVC编译,就是我上篇文章提到的调用VS的部分。执行下面命令以使用MinGW gcc编译:

cmake -G "MinGW Makefiles"

此处可能会报下面的错:报错
访问127~129:

cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
set_target_properties(gtest PROPERTIES VERSION ${GOOGLETEST_VERSION})
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)

很明显没有定义GOOGLETEST_VERSION的值,在开头加入

set(GOOGLETEST_VERSION 1.11.0)

即可

编译后执行mingw32的mingw32-make命令

mingw32-make

此时,googletest文件夹下新生成一个bin文件夹,包含libgtest.dll、libgtest_main.dll,这两个文件就是我们需要链接的。

搭建

最后成型的结构如下:

DateTestMy
├─ CMakeLists.txt
├─ gtest
│  ├─ include
│  │  └─ gtest
│  │     ├─ gtest-assertion-result.h
│  │     ├─ gtest-death-test.h
│  │     ├─ gtest-matchers.h
│  │     ├─ gtest-message.h
│  │     ├─ gtest-param-test.h
│  │     ├─ gtest-printers.h
│  │     ├─ gtest-spi.h
│  │     ├─ gtest-test-part.h
│  │     ├─ gtest-typed-test.h
│  │     ├─ gtest.h
│  │     ├─ gtest_pred_impl.h
│  │     ├─ gtest_prod.h
│  │     └─ internal
│  │        ├─ custom
│  │        │  ├─ gtest-port.h
│  │        │  ├─ gtest-printers.h
│  │        │  ├─ gtest.h
│  │        │  └─ README.md
│  │        ├─ gtest-death-test-internal.h
│  │        ├─ gtest-filepath.h
│  │        ├─ gtest-internal.h
│  │        ├─ gtest-param-util.h
│  │        ├─ gtest-port-arch.h
│  │        ├─ gtest-port.h
│  │        ├─ gtest-string.h
│  │        └─ gtest-type-util.h
│  ├─ lib
│  │  ├─ libgtest.dll
│  │  └─ libgtest_main.dll
│  └─ src
│     ├─ gtest-all.cc
│     ├─ gtest-assertion-result.cc
│     ├─ gtest-death-test.cc
│     ├─ gtest-filepath.cc
│     ├─ gtest-internal-inl.h
│     ├─ gtest-matchers.cc
│     ├─ gtest-port.cc
│     ├─ gtest-printers.cc
│     ├─ gtest-test-part.cc
│     ├─ gtest-typed-test.cc
│     ├─ gtest.cc
│     └─ gtest_main.cc
├─ include
│  └─ datet.h
├─ libgtest.dll
├─ libgtest_main.dll
├─ README.md
├─ src
│  └─ datet.cpp
└─ test
   └─ datet_unittest.cpp

首先创建工程目录,切换到工程目录下。

  1. 新建include、src、test分别放头文件、代码实现和测试函数。
  2. 新建gtest文件夹,将googletest的include、src直接挪过来。在gtest下建立lib文件夹,放之前编译出来的 libgtest.dlllibgtest_main.dll 。这两个文件在项目根目录也要复制一份,不然编译出来的exe文件会提示缺dll。
  3. 在工程根目录建立CMakeLists.txt

代码

一切准备就绪,现在开始编写CMakeLists.txt,我的如下:

# 指定CMake编译最低要求版本
cmake_minimum_required(VERSION 3.14)
# 给项目命名
project(datet)

# 指定.h头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include
                    ${CMAKE_CURRENT_SOURCE_DIR}/gtest/include
)

# 指定.dll链接库文件目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib)

# 收集c/c++文件并赋值给变量
# ${CMAKE_CURRENT_SOURCE_DIR}代表CMakeLists.txt当前项目录
file(GLOB
    SRC_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp
)

file(GLOB
    SRC_TEST_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/test/*.cpp
)

# 将c文件生成可执行文件sample1.exe
add_executable(${PROJECT_NAME} ${SRC_FILES} ${SRC_TEST_FILES})

# 指定链接库libgtest.dll、libgtest_main.dll
target_link_libraries(${PROJECT_NAME} gtest pthread)

每一项我都写了注释,实际使用时按自己项目内容修改。

我计划用一道很简单的LeetCode题目讲解TDD,题目如下(LeetCode 1154):

输入某年某月某日,判断这一天是这一年的第几天?。 测试用例有多组,注意循环输入

输入描述: 输入多行,每行间隔分割,分别是年,月,日 输出描述: 成功:返回outDay输出计算后的第几天; 失败:返回-1

示例: 输入 2012 12 31 输出 366

这题正常做起来其实非常简单,但是我计划用TDD的思想来完成。
首先是include\datet.h

int calculateDate(int year,int month,int day);

然后是src\datet.cpp

#include "datet.h"

int calculateDate(int year,int month,int day){
    return 1;
}

src下的cpp文件应当引用h文件,最后是test\datet_unittest.cpp。你可能会对函数内容有疑问,请保持疑问,继续读下去。

#include "gtest/gtest.h"
#include "datet.h"

TEST(dayFirstTest,dayFirst){
    EXPECT_EQ(calculateDate(2022,1,1),1);
}

int main(int argc, char **argv) {
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

main函数相关内容用于初始化gtest,基本不需要更改。
这里我写了一个简单的测试用例,测试case为dayFirstTest,name为dayFirst。其实一眼就能看出百分百通过测试的,而且换个数肯定通不过,但不要着急。

运行

首先是构建

cmake -G "MinGW Makefiles"

结果如图:构建结果
接着编译

mingw32-make

结果如下:编译结果执行datet.exe,回车,即可看到测试结果:在这里插入图片描述
这个测试我们通过了,这是显而易见的。但其实换个测试用例就大概率过不了。TDD的思想就在于,由测试引导开发,因为有不过的测试用例,所以需要对应修改代码,再重构,再编写新的不过的测试用例,如此循环,直到所有的测试用例全通过为止。

我将在下一篇文章介绍TDD。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【CMake】gtest环境搭建与TDD入门(二) 的相关文章

  • android-studio 项目启动 镜像源加速

    解决android studio download maven metadata xml卡住问题 https blog csdn net hzw2017 article details 114776815 android studio 阿里
  • 基于vue3 beego vue-beegoBackstage 后台管理系统

    基础 在线访问地址 vue3 go admingithub访问 vue3 go admin 功能 用户管理 lt gt 关联角色角色管理 lt gt 关联菜单菜单管理部门管理字典管理登录 权限校验动态路由生成 按钮权限菜单栏切换面包屑tab
  • Build Dense Trajectory Codes in Ubuntu

    Even when the OpenCV and ffmpeg have been successfully installed you still may meet the error of 34 undefined reference
  • javascript 数组拆分为3个一组

    span class token keyword const span a span class token operator 61 span span class token punctuation span span class tok
  • win10美化工具全套详细解析

    1 xff0c 任务栏透明工具StartllsBack 1 xff0c 首先安装 xff0c 选第一个为当前用户安装 xff08 这个选哪个都可以的 xff09 2 xff0c 然后就是设置这个任务栏透明了 xff0c 右键 开始 菜单找到
  • 前后端分离的情况下生成activiti流程图

    页面用调接口的方式 xff0c 将图片流显示 效果图 xff1a 注意 xff1a 布署到有些最小安装的linux服务器时 xff0c 用户任务框里面的中文会显示不出来 xff0c 这是因为缺少系统字体 宋体 xff0c 需要在服务器安装字
  • Linux文件系统变成只读的解决方法

    解决方法 1 重启看是否可以修复 xff08 很多机器可以的 xff09 2 使用用 fsck y dev hdc6 dev hdc6指你需要修复的分区 来修复文件系统 3 若 xff0c 在进行修复的时候有的分区会报错 xff0c 重新启
  • 19-29-k8s-基本命令-yaml-kubectl

    19 k8s 基本命令 yaml kubectl xff1a Kubernetes 集群的命令行工具kubectl 1 kubectl 命令格式 xff1a kubectl command type name flags 参数 xff1a
  • linux下安装nginx

    linux下安装nginx 注 xff1a 此处需要先安装vmware xff0c 下载Centos8等工具 xff0c 配置好一个虚拟机 1 下载nginx的linux版本 2 上传至搭建好的linux环境上 3 解压nginx压缩包 4
  • 128-152-spark-核心编程-源码

    128 spark 核心编程 源码 xff08 主要以了解基本原理和流程为主 xff09 xff1a 总体相关 1 环境准备 Yarn 集群 1 Driver Executor 2 组件通信 1 Driver 61 gt Executor
  • 6-zookeeper-hadoop-ha原理简述-fail

    6 zookeeper hadoop ha故障转移机制 xff0c 原理简述 HA概述 xff08 2 X版本架构 xff09 1 xff09 HA xff08 High available xff09 xff0c 即高可用 xff08 7
  • treelistview入门使用

    treelistview入门使用 1 创建窗口程序 2 引入库System Runtime InteropServices APIs dll和System Runtime InteropServices APIs dll 3 工具箱添加控件
  • ps-01

    ps 01 入门 xff1a 来源尚硅谷ps课程 xff0c 兴趣而已 xff0c 仅做记录 内容无实质性操作指导 1 软件安装 百度参考各种连接 xff0c 自己安装 https baiyunju cc 10433 2 基础操作 2 1打
  • Notes of Dense Trajectory

    Dense Trajectories densely sample feature points in each frame track points in the video based on optical flow compute m
  • python解析xml文件(解析、更新、写入)

    Overview 这篇博客内容将包括对XML文件的解析 追加新元素后写入到XML xff0c 以及更新原XML文件中某结点的值 使用的是python的xml dom minidom包 xff0c 详情可见其官方文档 xff1a xml do
  • 统计字符串中出现次数最多的字母及其出现次数C++

    小弱鸡看不太懂别人的代码 xff0c 于是用了结构体的方法 xff0c 将字母及其出现次数打包 xff01 include lt iostream gt include lt string h gt include lt algorithm
  • 安装man中文

    安装 man 中文手册 在使用 mac 或者 linux 的时候 xff0c 需要用到命令 xff0c 而大量的命令含有大量 options xff0c 一般很难记住 xff0c 使用 man 可以查看这些命令的 options xff0c
  • Ubuntu 18.04安装PyCharm社区版

    下载 下载 xff1a 或直接官网下载 链接 xff1a https pan baidu com s 1JLmMqJNBvClLAYuK1rlKrw 提取码 xff1a 41qk 安装 下载完后进入到存储文件的地址执行以下代码 xff0c
  • Android安卓动态获取存储权限,保存文件到外部存储

    添加存储权限 lt 外部存储的写权限 gt lt uses permission android name 61 34 android permission WRITE EXTERNAL STORAGE 34 gt lt 外部存储的读权限
  • 按键消抖详解

    一 按键消抖原理 抖动时间的长短由按键的机械特性决定 xff0c 一般为 5ms xff5e 10ms xff0c 键抖动会引起一次按键被误读多次 解决办法 xff1a 判断按键按下时 xff0c 延时 10 ms 即可 二 软件实现按键消

随机推荐

  • 20 分钟梳理 Spring 全家桶 !

    作 者 xff1a Daisy 授权转自IT技术思维 xff0c 每日精选优质干货 xff0c 欢迎关注 xff01 xff1e xff1e xff1c xff1c Spring框架自诞生以来一直备受开发者青睐 xff0c 有人亲切的称之为
  • Linux添加软件分类(GNOME桌面)

    Linux添加软件分类 xff08 GNOME桌面 xff09 之前安装TIM deepin wine 的时候发现TIM的分类为chat xff0c 而系统默认没有这个分类 xff0c 所以TIM就很自然的被划分到 其他 里边去了 这强迫症
  • gnome扩展推荐

    引言 xff1a gnome在Linux世界里作为一个比较流行的桌面环境 xff0c 默认不是十分美观 xff0c 有些功能也没有 xff0c 这个时候我们就可以选择安装扩展去个性化gnome 下面是我的桌面截图 xff0c 我利用了扩展实
  • SpringBoot + Redis实现布隆过滤器

    一 简述 关于布隆过滤器的详细介绍 xff0c 我在这里就不再赘述一遍了 我们首先知道 xff1a BloomFilter使用长度为m bit的字节数组 xff0c 使用k个hash函数 xff0c 增加一个元素 通过k次hash将元素映射
  • 屏蔽效能预估

    今天完成了屏蔽效能预估部分的程序 由于公式比较多 xff0c 而且就编程本身而言技术含量不高 xff0c 因此不将源代码贴出 xff0c 有需要者可以联系我 程序界面如下 xff1a
  • SSH 命令的11种用法

    使用ssh连接远程主机 最简单的用法只需要指定用户名和主机名参数即可 xff0c 主机名可以是 IP 地址或者域名 ssh user 64 hostname ssh连接到其他端口 SSH 默认连接到目标主机的 22 端口上 xff0c 可以
  • Spring配置的可选方案(三种配置方式)

    版权声明 xff1a 本文摘自 Spring实战 第4版 xff0c 美 Craig Walls 著 xff0c 张卫滨 译 本文仅作为学习与交流使用 xff0c 如有侵权请留言联系作者 转载请注明出处 目录 一 自动化装配Bean 注释
  • ftp工具

    本文会介绍java代码的ftp工具使用 xff0c 代码实现的功能难免不全 xff0c 要完整的体验ftp功能 xff0c 建议使用该ftp工具 xff1a iis7服务器管理工具 iis7服务器管理工具 xff08 曾用名 xff1a I
  • windows server 2000 r2 设置FTP文件服务器

    最近有一个需求需要将我们自己的一台windows服务器设置文件服务器 xff0c 小小记录一下 xff0c 设置过程 搭建IIS 第一步 xff1a 打开控制面板 第二步 xff1a 点击 打开或关闭 Windows 功能 第三步 xff1
  • ubuntu通过shell脚本实现服务自启和自动关机

    通常服务器开启后需要输入一大堆繁琐的进入文件 启动服务等命令 xff0c 每天如此就会逼着自己寻找捷径 xff0c 毕竟时间不用来学习就是在浪费生命嘛 xff1a Shell脚本挺身而出 xff1a 实现 xff1a 1 配置开机root账
  • 是什么导致了nginx.service: control process exited, code=exited status=1?

    是什么导致了nginx service control process exited code 61 exited status 61 1 xff1f 今天使用脚本安装nginx服务时遇到下面的问题 xff1a 那就先敲命令呗 xff0c
  • .jar与sources.jar区别

    首先 xff0c 当我们在下载jar包与引入jar包的时候可能会发现 xff0c 存在jar文件与相应的sources jar文件 如下图所示 xff1a 这个时候 xff0c 到底该下载哪一个 xff0c 或者我们需要的是哪一个 是jun
  • bat暂停5秒

    choice T 5 C ync CS D y n
  • Linux 开机自启动

    一 无界面的程序自启动 etc rc local 1 编辑 etc rc local vi etc rc local 2 添加要执行的命令 在exit 0 之前 注意 xff1a 这里的执行命令都必须是全路径的 xff0c 就算你添加到了
  • 使用firefox color自定义firefox的主题

    本说明基于firefox 79 轻量级主题 引用 xff1a firefox关于主题的说法 xff0c firefox现在仅支持轻量级主题了 那么什么是轻量级主题呢 xff1f mozilla官方并没有明确的定义 xff0c 我的理解是 x
  • TCL判断条件

    编写TCL代码时遇要写一个if判断条件 xff0c 很简单的一个语句 xff0c 结果却费了很大力气才搞定 要判断的是 xff0c 如果执行info exists成功而且某全局数组C的某个成员大于0 xff0c 正确的语句为 xff1a i
  • 实验二:线性时间选择

    实验二 xff1a 线性时间选择 问题描述 xff08 1 xff09 线性时间选择问题 给定线性序集中n个元素和一个整数k xff0c 1 lt 61 k lt 61 n 要求找出这n个元素中第k小的元素 xff0c 即如果将这个n个元素
  • 我的 IDEA 常用插件介绍

    本文同步发表于我的微信公众号 xff0c 在微信搜索 及格 即可关注 这篇文章介绍一下我 IDEA 里安装的插件 我的 IDEA 版本是IntelliJ IDEA 2021 3 3 xff0c 并且打上了官方的汉化包 xff0c 但我假设看
  • 在电脑上配置 protobuf + VS Code 开发环境

    工作需要学习 protobuf 开发 xff0c 如果能在 Windows 环境下使用更便于练习 xff0c 于是这篇文章介绍一下如何在 Windows 下借助 VS Code 配置 protobuf 开发环境 Protobuf 介绍 pr
  • 【CMake】gtest环境搭建与TDD入门(二)

    上一篇文章 xff0c 我们介绍了CMake xff1a 传送门 这一篇文章我暂时不打算继续写CMake相关的东西了 xff0c 转而写一个叫TDD的开发理论 xff0c 当然 xff0c 理论是需要实践支撑的 xff0c 利用CMake