如何在cmake项目结构中合并unittest



我正在做一个嵌入式项目。作为这个项目的一部分,我有使用gcc和Gtest的单元测试。问题是,合并这些单元测试的最佳方法是什么?我目前的实现是,我有一个不同的构建类型称为unittest。我有一个CMAKE_BUILD_TYPE子句,并决定使用哪个源,创建哪个目标。我看到这不是一个好的设计,这搞砸了多配置生成器。有什么优雅的解决方案呢?

提前感谢您的回答。

为测试创建单独的可执行文件,并使用ctest:

add_test添加可执行文件+命令行参数的组合作为测试ctest运行和enable_testing()在顶层CMakeLists.txt

这允许您在构建目录中简单地运行ctest,并且您可以使用-C命令行选项传递配置以进行测试。

add_executable(MyTest test.cpp test_helper.cpp test_helper.h)
target_include_directories(MyTest PRIVATE .)
target_link_libraries(MyTest PRIVATE theLibToTest)
add_test(NAME NameOfTest COMMAND MyTest --gtest_repeat=1000)
enable_testing()

从构建目录运行ctest会运行一个名为NameOfTest的测试。对于多配置生成器,您只需使用-C命令行选项

指定要测试的配置
ctest -C Release

当然,您可以多次使用add_test来添加不同的测试可执行文件,或者使用不同的命令行选项添加相同的测试可执行文件。

此外,我建议找出一种将结果存储在文件中的方法,因为这是通过测试参数实现的,因为ctest的输出可能不会达到这个目的。我对gtest不太熟悉,不能给你建议。

Btw:ctest将退出码0视为成功,任何其他退出码都视为失败,但我猜gtest产生的可执行文件满足此属性。

如果您不需要与其他测试同时构建测试,您可以将它们从所有测试中排除,可能会添加一个依赖于所有单元测试的自定义目标,并且也从所有单元测试中排除,以允许一次构建所有单元测试。

你也可以使用一个缓存变量来打开和关闭测试:

# enabled via -D TEST_MY_PROJECT:BOOL=1 parameter for cmake
set(TEST_MY_PROJECT 0 CACHE BOOL "enable tests for my project")
if (TEST_MY_PROJECT)
# testing setup goes here
endif()

最新更新