cmake构建googletest的单元测试(外部仓库引入)

这段时间看了些cmake构建的一些规则,正巧项目中需要用到单元测试,这里就用cmake构建googletest框架(单元测试)来进行测试。正好也复习一下cmake构建规则。

这里进行cmake构建的时候采用的是引入本地第三方库的方式进行构建,一般常规构建大都采用

将第三方库源文件fetch到本地项目的third_party目录下进行整体项目的引入构建。

我这里采用先将第三方源码编译安装后,引入到本地需要的项目中去的方式构建。

首先,这里先下载googletest的源代码,这里采用的是1.10.0版本:

wget https://github.com/google/googletest/archive/refs/tags/release-1.10.0.tar.gz

这里简单记录下googletest构建的过程

1.解压源码

tar -zxvf release-1.10.0.tar.gz

这里我将源码解压到$HOME/app目录下了

2.cmake构建,当然也可以使用bazel,不过这里我采用cmake进行外部构建,这里需要指定两个构建参数,一个是BUILD_SHARED_LIBS=ON 设置为编译成动态链接库(googletest默认是使用的静态链接库 ,可能跟版本有关,这里不用太纠结),另一个是安装目录编译参数CMAKE_INSTALL_PREFIX设置为安装的路径地址(这里安装在$HOME/app/googletest-build-release-1.10)

mkdir -p $HOME/app/googletest-build-release-1.10

mkdir build && cd build

cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=$HOME/app/googletest-build-release-1.10 ..

3.编译&&安装

make -j && make install

安装完成后,可以看到大概如下图所示的状态:

至此 googletest编译安装完成!

下面就要在需要googletest的项目中引入googletest了。

 我这里的项目目录为M-unit-test

目录结构很简单:

 src下是源代码,CMakeLists.txt是构建规则,build下是构建过程生成的一些中间文件和最终的可执行文件

unit_tests.cpp代码为:

#include <gtest/gtest.h>

// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
  // Expect two strings not to be equal.
  EXPECT_STRNE("hello", "world");
  // Expect equality.
  EXPECT_EQ(7 * 6, 42);
}

CMakeLists.txt内容为:

cmake_minimum_required(VERSION 3.5)
 
set(CMAKE_C_COMPILER "/home/wzy/app/gcc-9.5.0-build/bin/gcc")
set(CMAKE_CXX_COMPILER "/home/wzy/app/gcc-9.5.0-build/bin/g++")
# Set the project name
project (google_test_example)
#############################################
# Unit tests
# enable CTest testing
enable_testing()

# include_directories("/home/wzy/app/googletest-build-release-1.10/include")

# get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
# message("include_dirs: ${dir}")

# Add a testing executable
add_executable(unit_tests src/unit_tests.cpp)

#compiler with the -I flag eg. -I/directory/path
target_include_directories(unit_tests PUBLIC "/home/wzy/app/googletest-build-release-1.10/include")


# 打印指定的头文件搜索路径
get_property(public_private_dirs TARGET unit_tests PROPERTY INCLUDE_DIRECTORIES)
message("public_private_dirs: ${public_private_dirs}")

#find libgtest.so library
find_library(GTEST 
    gtest 
    "/home/wzy/app/googletest-build-release-1.10/lib64" )
find_library(GTEST_MAIN 
    gtest_main 
    "/home/wzy/app/googletest-build-release-1.10/lib64" )    
IF (NOT GTEST)
    MESSGAGE(FATAL_ERROR "libgtest.so not found")
ENDIF(NOT GTEST)
IF (NOT GTEST_MAIN)
    MESSGAGE(FATAL_ERROR "libgtest_main.so not found")
ENDIF(NOT GTEST_MAIN)
message(STATUS " gtest path : " ${GTEST})
message(STATUS " gtest_main path : " ${GTEST_MAIN})
target_link_libraries(unit_tests
    ${GTEST} 
    ${GTEST_MAIN}
)
#To add a test you call the add_test() function. This will create a named test which will run the supplied command.
add_test(test_all unit_tests)

通过enable_testing() 开启ctest 测试。

其他的都标注有注释,还算清楚,这里就不一一解释了。

这里gtest的库文件路径和头文件路径都是第一步安装的路径。

接下来就是构建和编译执行了

# 构建
cmake -B build
# 编译
cmake --build build
# 执行测试用例
./build/unit_tests

最终结果为:

至此,cmake引入本地项目外的代码库进行单元测试就已经完成了! 

 

可以看到这里采用的构建使用的是动态链接的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值