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环境配置以及应用的更多相关文章

  1. Code Blocks+gtest环境配置

    本文仅介绍Code::Blocks+gtest环境配置,gtest具体使用方法请参考: 玩转Google开源C++单元测试框架Google Test系列(gtest)(总) http://www.cn ...

  2. uboot环境配置

    uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...

  3. 史上最全Windows版本搭建安装React Native环境配置

    史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有很多坑要跳,为了帮助新手快速无误的 ...

  4. Electron的环境配置

    原文地址http://huisky.com/blog/161218121551123 本文介绍了Electron的环境配置,包括Electron下载.nodejs下载安装.NPM+Bower安装配置. ...

  5. Python开发环境配置

    好久没有写博客了,自从6月份毕业后,进入一家做书法.字画文化宣传的互联网公司(www.manyiaby.com),这段时间一直在进行前端开发,对于后端的使用很少了,整天都是什么html.css.jav ...

  6. PHP_环境配置_python脚本_2017

    Apache配置 需要安装:VC2015 httpd-2.4.16-win32-VC14.zip VC14就是2015的环境. 又比如:php-5.6.12-Win32-VC11-x86 VC11就是 ...

  7. PHP环境配置

    PHP环境配置 1.Apache的安装 第一步: 1.    双击httpd-2.2.17-win32-x86-no_ssl.msi.出现 Windows 标准的软件安装欢迎界面,直接点“Next”继 ...

  8. Visual studio 通用开发环境配置:SDL,FFMPEG为例

    引言 每一个C++库的使用都是从开发环境的配置开始的,其实每个库的配置过程都是大同小异,总结下来有下面几个步骤: 下载库文件,这里假定是已经预先编译完成的. 配置库文件的包含目录(include)和库 ...

  9. windows 7下React Native环境配置

    React Native 是 Facebook 推出的一个用 Java 语言就能同时编写 ios,android,以及后台的一项技术,它可以做到实时热更新 .FaceBook 也号称这们技术是 “Le ...

随机推荐

  1. 开源的.Net 工作流引擎Elsa初试——创建工作流服务器和图形化工作流配置管理应用

    微软的Workflow Foundation基于.Net Framework,并且没有向.Net Core迁移的计划.我们的很多项目使用了工作流引擎,这些项目向.Net Core以及更高版本迁移时遇到 ...

  2. Spring IOC 常用注解与使用

    @Component 注解@component代表spring ioc 会把这个类扫描生成Bean实例 @Component public class Role{ @Value("1&quo ...

  3. Improved Security for a Ring-Based Fully Homomorphic Encryption Scheme-2013:解读

    本文记录阅读此论文的笔记 摘要 (1)1996年,HPS三人提出一个格上的高效加密方案,叫做NTRUEncrypt,但是没有安全性证明:之后2011年,SS等人修改此方案,将其安全规约到标准格上的困难 ...

  4. SRE,了解一下?35+岁程序员新选择

    摘要:随着云业务的发展,今后会有越来越多的工程师深入到SRE领域. 本文分享自华为云社区<浅谈SRE角色认知>,作者: SRE确定性运维. 一.什么是SRE? SRE(Site Relia ...

  5. Idea创建文件夹自动合成一个

    在idea中创建文件夹时,它们总是自动合成一个,如下图: 文件夹自动折叠真的很影响效率,可能会引发一些不经意的失误 解决方法: 取消这个地方的勾选 这样就可以正常创建文件夹了

  6. 获取请求体数据 POST

    POST获取请求体 请求体中封装了 POST请求的请求参数 获取流对象 再从流对象中那数据 一种字节流 一种字符流 BufferedReader getReader()获取字符输入流 只能操作字符 S ...

  7. 『现学现忘』Docker基础 — 42、补充:save和load命令说明

    目录 1.save命令 2.load命令 1.save命令 将指定的一个或多个镜像保存成.tar格式的文件,进行打包归档. 查看docker save帮助命令,如下: [root@192 ~]# do ...

  8. Training a classifier

    你已经学习了如何定义神经网络,计算损失和执行网络权重的更新. 现在你或许在思考. What about data? 通常当你需要处理图像,文本,音频,视频数据,你能够使用标准的python包将数据加载 ...

  9. JDBC:获取自增长键值的序号

    1.改变的地方  实践: package com.dgd.test; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  10. 等待唤醒机制代码实现_包子类&包子铺类和等待唤醒机制代码实现_吃货类&测试类

    资源类:包子类 设置包子的属性 皮 陷 包子的状态:有 true 没有 false public class BaoZi { //皮 String pi; //陷 String xian; //包子的 ...