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 其它参考网址:


最新文章

  1. VC++2013出现bug: 无法打开源文件“stdafx.h”
  2. MFC编程入门之二十六(常用控件:滚动条控件ScrollBar)
  3. IOS ScrollView放大缩小点击位置并居中
  4. php中htmlspecialchars和htmlentiti
  5. sql语句like多个条件的写法实例
  6. FusionCharts Free 注意事项
  7. .NET技能分析
  8. sql 数据字段类型
  9. Composer简介及使用实例
  10. SpringMVC处理multipart请求.
  11. (五十九)iOS网络基础之UIWebView简易浏览器实现
  12. layui topbar图标(即返回顶部)未显示的解决方法
  13. 好好耕耘 redis和memcached的区别
  14. 【python练习题】程序14
  15. CH2906 武士风度的牛(算竞进阶习题)
  16. Sql 注入详解:宽字节注入+二次注入
  17. imu_tk标定算法原理
  18. 21-hadoop-weibo推送广告
  19. 【Delphi】基于状态机的串口通信
  20. Android Studio 使用VCS版本控制

热门文章

  1. MyBatis - MyBatis的层次结构
  2. 聊聊消息中间件(1),AMQP那些事儿
  3. 基于Kubernetes v1.24.0的集群搭建(一)
  4. Vmware 10~16激活码/序列号 汇总
  5. spring boot用ide新建项目遇到的restcontroller不能导入的问题
  6. 【Pr】基础流程
  7. UiPath存在文本Text Exists的介绍和使用
  8. PotPlayer播放百度云盘视频
  9. 训练一个图像分类器demo in PyTorch【学习笔记】
  10. PTA(BasicLevel)-1023 组个最小数