0


cmake应用:集成gtest进行单元测试_cmake 使用 gtest

enable_testing()

add_executable(test_add test/c/test_add.c)

add_executable(test_minus test/c/test_minus.c)

target_link_libraries(test_add math)

target_link_libraries(test_minus math)

add_test(NAME test_add COMMAND test_add 10 24 34)

add_test(NAME test_minus COMMAND test_minus 40 96 -56)

通过使用gtest可以简化这个流程,让开发者可以专注在测试用例的书写上,而不用手动编写大量的main函数,以及一些判断输出是否符合预期的附加代码。

三 集成gtest

1 将gtest源码加入项目

gtest是一个开源的框架,代码位于github仓库:google/googletest,本文介绍直接将gtest加入到项目中,通过CMake编译使用。

首先在项目根目录新建一个third_party目录,下载源码的最新release版本,并解压:

mkdir third_party

cd third_party

wget https://codeload.github.com/google/googletest/zip/refs/tags/release-1.10.0

unzip googletest-release-1.10.0.zip

2 将gtest添加为子模块

修改项目根目录的CMakeLists.txt文件,使用上一篇文章介绍的命令add_subdirectory,在开启单元测试时,添加gtest为子模块,并将对应头文件路径添加进来:

enable_testing()

add_subdirectory(third_party/googletest-release-1.10.0)

include_directories(third_party/googletest-release-1.10.0/googletest/include)

此时执行命令:

cmake -B cmake-build

cmake --build cmake-build

可以看到构建目录下多了一个目录cmake-build/third_party/googletest-release-1.10.0,并且gtest编译生成了4个新的库文件(gtest子模块的编译目标,位于目录cmake-build/lib下):

  1. libgtest.a

  2. libgtest_main.a

  3. libgmock.a

  4. libgmock_main.a

其中libgtest.a提供单元测试相关的功能,libgtest_main.a提供单元测试的主入口,只有链接该库,测试用例就会编译成可执行文件;两个mock库也是类似的,主要提供数据库交互,网络连接等方面的模拟测试,这不是本文的重点。

此时就可以在链接其他目标时直接使用gtest的这4个编译目标(target)。

3 编写测试用例

接下来直接修改先前的两个测试用例源文件,实现相同的测试功能:

  1. test/c/test_add.c

  2. test/c/test_minus.c

因为使用的是C++测试框架,所以上述两个源文件修改为.cc后缀。

在源文件中include头文件gtest/gtest.h,使用gtest测试用例定义宏来定义测试用例:

TEST(test_case_name, test_name) {}

一个test_case_name下面可以包含多个不同(test_name)的测试。

test/c/test_add.cc内容为:

#include “gtest/gtest.h”

#include “math/add.h”

TEST(TestAddInt, test_add_int_1) {

int res = add_int(10, 24);

EXPECT_EQ(res, 34);

}

test/c/test_minus.cc内容为:

#include “gtest/gtest.h”

#include “math/minus.h”

TEST(TestMinusInt, test_minus_int_1) {

int res = minus_int(40, 96);

EXPECT_EQ(res, -56);

}

显而易见,测试用例的代码量比之前少了很多,而且更加可读,更加专业。

这里使用了一个判断值相等的断言EXPECT_EQ,gtest中的断言分成两大类:

  1. ASSERT_*系列:如果检测失败就直接退出当前函数

  2. EXPECT_*系列:如果检测失败发出提示,并继续往下执行

gtest有很多类似的宏用来判断数值的关系、判断条件的真假、判断字符串的关系。 对于条件判断可以使用:

ASSERT_TRUE(condition); // 判断条件是否为真

ASSERT_FALSE(condition); // 判断条件是否为假

对于数值比较可以使用:

ASSERT_EQ(val1, val2); // 判断是否相等

ASSERT_NE(val1, val2); // 判断是否不相等

ASSERT_LT(val1, val2); // 判断是否小于

ASSERT_LE(val1, val2); // 判断是否小于等于

ASSERT_GT(val1, val2); // 判断是否大于

ASSERT_GE(val1, val2); // 判断是否大于等于

对于字符串比较可以使用:

ASSERT_STREQ(str1,str2); // 判断字符串是否相等

ASSERT_STRNE(str1,str2); // 判断字符串是否不相等

ASSERT_STRCASEEQ(str1,str2); // 判断字符串是否相等,忽视大小写

ASSERT_STRCASENE(str1,str2); // 判断字符串是否不相等,忽视大小写

4 添加测试用例

书写好测试用例源文件后,需要修改项目根目录的CMakeLists.txt:

enable_testing()

add_subdirectory(third_party/googletest-release-1.10.0)

include_directories(third_party/googletest-release-1.10.0/googletest/include)

set(GTEST_LIB gtest gtest_main)

add_executable(test_add test/c/test_add.cc)

add_executable(test_minus test/c/test_minus.cc)

target_link_libraries(test_add math gtest gtest_main)

target_link_libraries(test_minus math gtest gtest_main)

add_test(NAME test_add COMMAND test_add)

add_test(NAME test_minus COMMAND test_minus)

对于一个单元测试来说,添加的步骤为:

  1. 使用add_executable添加测试目标

  2. 使用target_link_libraries为测试目标添加依赖gtest和gtest_main

  3. 使用add_test添加到项目,以便可以使用ctest命令执行测试

需要注意的不同就是,依旧将单元测试的源文件编译为可执行文件,并且链接的时候链接了gtest和gtest_main。必须要链接gtest_main库,才能给单元测试添加main函数主入口,否则在链接的时候将会报错。

5 运行测试

在前面的文章中已经介绍过了,在构建编译完成后,进入构建目录,使用ctest命令执行测试即可。 笔者常用的命令为:

make test CTEST_OUTPUT_ON_FAILURE=TRUE GTEST_COLOR=TRUE

或者

GTEST_COLOR=TRUE ctest --output-on-failure

标签: 单元测试 log4j

本文转载自: https://blog.csdn.net/2401_86983854/article/details/142001328
版权归原作者 2401_86983854 所有, 如有侵权,请联系我们删除。

“cmake应用:集成gtest进行单元测试_cmake 使用 gtest”的评论:

还没有评论