GoogleTest环境配置以及应用
1 GoogleTest源码编译:
GoogleTest代码仓库URL:
https://github.com/google/googletest.git
下载源代码:
git clone --branch release-1.12.1 https://github.com/google/googletest.git googletest
1.1 Windows下GoogleTest的编译方法(包含example):
这里选择的编译器是Visual Studio 16 2019,需要用别的版本的编译器,请自行重新指定一下编译器版本:
VS2022为:"Visual Studio 17 2022"
VS2019为:"Visual Studio 16 2019"
VS2017为:"Visual Studio 15 2017"
VS2015为:"Visual Studio 14 2015"
VS2013为:"Visual Studio 12 2013"
VS2012为:"Visual Studio 11 2012"
VS2010为:"Visual Studio 10 2010"
1.1.1 debug版本编译:
mkdir debug # 在源码根目录创建一个名叫debug的文件夹
cd debug # 进入debug文件夹
cmake "../" -DCMAKE_CONFIGURATION_TYPES=Debug -Dgtest_force_shared_crt=ON -Dgtest_build_samples=ON -DCMAKE_INSTALL_PREFIX=D:/SDK/GoogleTest/v1.10.x/debug -G "Visual Studio 16 2019" -A x64
1.1.2 release版本编译:
mkdir release # 在源码根目录创建一个名叫release的文件夹
cd release # 进入release文件夹
cmake "../" -DCMAKE_CONFIGURATION_TYPES=Release -Dgtest_force_shared_crt=ON -Dgtest_build_samples=ON -DCMAKE_INSTALL_PREFIX=D:/SDK/GoogleTest/v1.10.x/release -G "Visual Studio 16 2019" -A x64
生成install文件:
管理员启动:x64_x86 Cross Tools Command Prompt for VS 2019.lnk
然后执行:msbuild INSTALL.vcxproj (release版本可能会报错)
或者使用用:cmake --build . --target INSTALL --config Release 编译并安装。
1.2 Linux下GoogleTest的编译方法(包含example):
1.2.1 debug版本编译:
mkdir debug # 在源码根目录创建一个名叫debug的文件夹
cd debug # 进入debug文件夹
cmake "../" \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_DEBUG_POSTFIX=d \
-Dgtest_force_shared_crt=ON \
-Dgtest_build_samples=ON \
-DCMAKE_INSTALL_PREFIX=~/SDK/googletest/v1.12.1/debug \
-DCMAKE_C_COMPILER=/usr/bin/gcc-11 \
-DCMAKE_CXX_COMPILER=/usr/bin/g++-11
make
make install
1.2.2 release版本编译:
mkdir release # 在源码根目录创建一个名叫release的文件夹
cd release # 进入release文件夹
cmake "../" \
-DCMAKE_BUILD_TYPE=Release \
-Dgtest_force_shared_crt=ON \
-Dgtest_build_samples=ON \
-DCMAKE_INSTALL_PREFIX=~/SDK/googletest/v1.12.1/release \
-DCMAKE_C_COMPILER=/usr/bin/gcc-11 \
-DCMAKE_CXX_COMPILER=/usr/bin/g++-11
编译参数含义说明:
-DCMAKE_BUILD_TYPE:用来制定编译Debug版本,还是Release版本。
-DCMAKE_DEBUG_POSTFIX:debug版本生成lib追加的后缀名(d表示原本为xx.so,编译生成的是xxd.so)
-Dgtest_force_shared_crt=ON:Winodws设置构建库类型为MD。
-DCMAKE_INSTALL_PREFIX=~/SDK/googletest/v1.12.1/debug :指定SDK生成后的保存目录。
-DCMAKE_C_COMPILER=/usr/bin/gcc-11:指定使用的gcc编译版本。
-DCMAKE_CXX_COMPILER=/usr/bin/g++-11:指定使用的g++版本。
2 GoogleTest常用测试宏:
ASSERT宏 | EXPECT宏 | 功能 | 使用场景 |
---|---|---|---|
ASSERT_TRUE | EXPECT_TRUE | 判真 | 判断表达式真假 |
ASSERT_FALSE | EXPECT_FALSE | 判假 | 判断表达式真假 |
ASSERT_EQ | EXPECT_EQ | 相等 | 数值比较 |
ASSERT_NE | EXPECT_NE | 不等 | 数值比较 |
ASSERT_GT | EXPECT_GT | 大于 | 数值比较 |
ASSERT_LT | EXPECT_LT | 小于 | 数值比较 |
ASSERT_GE | EXPECT_GE | 大于或等于 | 数值比较 |
ASSERT_LE | EXPECT_LE | 小于或等于 | 数值比较 |
ASSERT_FLOAT_EQ | EXPECT_FLOAT_EQ | 单精度浮点值相等 | 数值比较 |
ASSERT_DOUBLE_EQ | EXPECT_DOUBLE_EQ | 双精度浮点值相等 | 数值比较 |
ASSERT_NEAR | EXPECT_NEAR | 浮点值接近(第3个参数为误差阈值) | 双精度浮点值相等、数值比价 |
ASSERT_STREQ | EXPECT_STREQ | C字符串相等 | 字符串比较 |
ASSERT_STRNE | EXPECT_STRNE | C字符串不等 | 字符串比较 |
ASSERT_STRCASEEQ | EXPECT_STRCASEEQ | C字符串相等(忽略大小写) | 字符串比较 |
ASSERT_STRCASENE | EXPECT_STRCASENE | C字符串不等(忽略大小写) | 字符串比较 |
ASSERT_PRED1 | EXPECT_PRED1 | 自定义谓词函数,(pred, arg1)(还有_PRED2, ..., _PRED5 | 自定义比较函数 |
3 GoogleTest使用步骤
3.1 以sample1为例:
sample1源码地址:https://github.com/calm2012/my_sample_code/tree/main/GoogleTest/GoogleTest_sample1
3.1.1 sample1目录结构如下:
└─sample1
│ CMakeLists.txt
│ sample1.h
│ sample1.cc
│ sample1_unittest.cc
│
├─debug
└─googletest_lib
CMakeLists.txt文件内容如下:
cmake_minimum_required(VERSION 3.14)
project(sample1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(sample1
sample1.h
sample1.cc
sample1_unittest.cc
)
# 链接gtest_maind.lib库
target_link_libraries(sample1 ${CMAKE_SOURCE_DIR}/googletest_lib/lib/debug/gtest_maind.lib)
# 链接gtestd.lib库
target_link_libraries(sample1 ${CMAKE_SOURCE_DIR}/googletest_lib/lib/debug/gtestd.lib)
# 在工程中共引入GoogleTest头文件搜索路径
target_include_directories(sample1 PUBLIC ${CMAKE_SOURCE_DIR}/googletest_lib/include)
sample1.h文件内容如下:
#ifndef GTEST_SAMPLES_SAMPLE1_H_
#define GTEST_SAMPLES_SAMPLE1_H_
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
int Factorial(int n);
#endif // GTEST_SAMPLES_SAMPLE1_H_
sample1.cc文件内容如下:
#include "sample1.h"
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
int Factorial(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
sample1_unittest.cc文件内容如下:
#include <limits.h>
#include "sample1.h"
#include "gtest/gtest.h"
namespace {
// Tests factorial of negative numbers.
TEST(FactorialTest, Negative) {
// This test is named "Negative", and belongs to the "FactorialTest"
// test case.
EXPECT_EQ(1, Factorial(-5));
EXPECT_EQ(1, Factorial(-1));
EXPECT_GT(Factorial(-10), 0);
}
// Tests factorial of 0.
TEST(FactorialTest, Zero) {
EXPECT_EQ(1, Factorial(0));
}
// Tests factorial of positive numbers.
TEST(FactorialTest, Positive) {
EXPECT_EQ(1, Factorial(1));
EXPECT_EQ(2, Factorial(2));
EXPECT_EQ(6, Factorial(3));
EXPECT_EQ(40320, Factorial(8));
}
} // namespace
3.1.2编译构建命令:
mkdir debug
cd debug
cmake "../" \
-DCMAKE_BUILD_TYPE:STRING=Debug \
-DCMAKE_C_COMPILER:STRING=/usr/bin/gcc \
-DCMAKE_CXX_COMPILER:STRING=/usr/bin/g++
cmake --build . --config Debug
cd Debug
运行:sample1
3.2 再看在MessagePush工程中如何引入GoogleTest
3.2.1 最后在你的工程里如CMakeLists.txt中引入:
add_gtest(base_common_unittest)
# 或者:
add_gtest_main(mysql_wrapper_unittest)
- add_gtest的作用是为了在Windows下添加gtest.lib,或者Linux下添加libgtest.a。同时引入GoogleTest头文件搜索路径
- add_gtest_main的作用是为了在Windows下添加gtest.lib、gtest_main.lib,或者Linux下添加libgtest.a、libgtest_main.a。同时引入GoogleTest头文件搜索路径
add_gtest宏:
macro(add_gtest target_name)
target_link_libraries(${target_name}
${googletest_lib_path}/${gtes_lib_name} # googletest_lib_path: gooltest库文件路径
${target_name} ${googletest_lib_path}/${gmock_lib_name}
-lpthread
)
target_include_directories(${target_name} PUBLIC ${googletest_include_path})
endmacro(add_gtest)
add_gtest_main宏:
macro(add_gtest_main target_name)
target_link_libraries(${target_name}
${googletest_lib_path}/${gtes_lib_name} # googletest_lib_path: gooltest库文件路径
${googletest_lib_path}/${gtes_main_lib_name}
${googletest_lib_path}/${gmock_lib_name}
${googletest_lib_path}/${gmock_main_lib_name}
-lpthread
)
target_include_directories(${target_name} PUBLIC ${googletest_include_path})
endmacro(add_gtest_main)
3.3 GoogleTest常用测试宏(TEST/TEST_F/TEST_P/TYPED_TEST)的一般使用场景:
- TEST:通常用于简单的函数测试。
- TEST_F:通常用于需要访问类对象时的测试。
- TEST_P:通常用于把测试对象当作参数传入或有大量重复测试case时。
- TYPED_TEST:通常用于接口测试。
3.4 其它参考网址:
- googletest:https://github.com/google/googletest
- googletest-gmock使用示例:https://zhuanlan.zhihu.com/p/101906555
- GoogleTest单元测试学习:https://blog.csdn.net/Tosonw/article/details/89449285
- GoogleTest Primer:https://blog.csdn.net/qq_34548075/article/details/122864792
GoogleTest环境配置以及应用的更多相关文章
- Code Blocks+gtest环境配置
本文仅介绍Code::Blocks+gtest环境配置,gtest具体使用方法请参考: 玩转Google开源C++单元测试框架Google Test系列(gtest)(总) http://www.cn ...
- uboot环境配置
uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...
- 史上最全Windows版本搭建安装React Native环境配置
史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...
- Electron的环境配置
原文地址http://huisky.com/blog/161218121551123 本文介绍了Electron的环境配置,包括Electron下载.nodejs下载安装.NPM+Bower安装配置. ...
- Python开发环境配置
好久没有写博客了,自从6月份毕业后,进入一家做书法.字画文化宣传的互联网公司(www.manyiaby.com),这段时间一直在进行前端开发,对于后端的使用很少了,整天都是什么html.css.jav ...
- PHP_环境配置_python脚本_2017
Apache配置 需要安装:VC2015 httpd-2.4.16-win32-VC14.zip VC14就是2015的环境. 又比如:php-5.6.12-Win32-VC11-x86 VC11就是 ...
- PHP环境配置
PHP环境配置 1.Apache的安装 第一步: 1. 双击httpd-2.2.17-win32-x86-no_ssl.msi.出现 Windows 标准的软件安装欢迎界面,直接点“Next”继 ...
- Visual studio 通用开发环境配置:SDL,FFMPEG为例
引言 每一个C++库的使用都是从开发环境的配置开始的,其实每个库的配置过程都是大同小异,总结下来有下面几个步骤: 下载库文件,这里假定是已经预先编译完成的. 配置库文件的包含目录(include)和库 ...
- windows 7下React Native环境配置
React Native 是 Facebook 推出的一个用 Java 语言就能同时编写 ios,android,以及后台的一项技术,它可以做到实时热更新 .FaceBook 也号称这们技术是 “Le ...
随机推荐
- Django虚拟环境详解
Django虚拟环境之 Virtualenv 1.安装 pip install virtualenv 2.创建虚拟环境 创建虚拟环境文件夹在当前目录 virtualenv [env_name] 3.激 ...
- 文字轮播与图片轮播?CSS 不在话下
今天,分享一个实际业务中能够用得上的动画技巧. 巧用逐帧动画,配合补间动画实现一个无限循环的轮播效果,像是这样: 看到上述示意图,有同学不禁会发问,这不是个非常简单的位移动画么? 我们来简单分析分析, ...
- 借助SpotBugs将程序错误扼杀在摇篮中
背景 最近一年多在一家toB业务的公司,部门主要做的是建筑行业的招投标业务信息化,希望借助软件来达到"阳光.降本.提效"的目的,我刚入职时大概30多家客户,截止现在已经超过100家 ...
- php 使用phpqrcode生成二维码并上传到OSS
一般情况调用phpqrcode第三方插件 会把生成的二维码图片保存到服务器,不保存服务器也会以header头的形式输出到浏览器,(我们不允许把图片文件保存的liunx服务器,只能保存到阿里云OSS存储 ...
- .NET 6.0.6 和 .NET Core 3.1.26、Visual Studio 2022 17.2 和 17.3 Preview 2 和 .NET 7.0 Preview 5 同时发布
Microsoft 昨天发布了适用于 .NET 6.0.6 和 .NET Core 3.1.26.NuGet.Visual Studio 2019 和 Visual Studio 2022 17.2 ...
- Django cors跨域问题
Django cors跨域问题 前后端分离项目中的跨域问题 即同源策略 同源策略:同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器 ...
- 排名前三——python 开源 IDE
写在前面的一些P话: Python无处不在 ,似乎它支持从主要网站到桌面实用程序到企业软件的所有功能. Python已经被用来编写流行的软件项目,如dnf / yum,OpenStack,OpenSh ...
- NC200211 装备合成
NC200211 装备合成 题目 题目描述 牛牛有 \({x}\) 件材料 \({a}\) 和 \({y}\) 件材料 \({b}\) ,用 \({2}\) 件材料 \({a}\) 和 \({3}\) ...
- Vue模板解析
mustcache 什么是模板引擎 模板引擎是将数据变为视图的最优雅的解决方案 数据 [ {"name":"小明","age":12,&qu ...
- 写出个灵活的系统竟然可以如此简单!小白也能写出高级的Java业务!
一 最近正好公司里有个需求,一个短信业务接了多个第三方供应商,某些业务需要查询第三方供应商剩余的短信包数量去选择剩余量最多的渠道去批量发送.有些业务是指定了某个短信供应商,有些场景需要根据业务的值去动 ...