cmake - 通过新命令 gtest_discover_tests 在 CMake/Ctest 中使用谷歌测试
问题描述
我正在尝试将 googletest 与 CMake/Ctest 一起使用。我有几个用于我的测试的源文件(每个都包含许多 TEST/TEST_F/... 命令),它们位于多个目录中。我希望与给定源相关的测试在与其源文件相同的目录中执行。另外,我更喜欢测试源文件的构建过程本身就是一个测试。所以我做了类似的东西:
file(GLOB_RECURSE test_srcs
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
"tests/*.cpp")
foreach(test_src ${test_srcs})
get_filename_component(test_dir ${test_src} DIRECTORY)
get_filename_component(test_exe ${test_src} )NAME_WE)
add_executable(${test_exe} EXCLUDE_FROM_ALL tests/gtest_main.cpp ${test_src})
set_target_properties(${test_exe}
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${test_dir}
)
target_link_libraries(${test_exe} gtest)
add_test(NAME build_${test_exe} COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${test_exe})
set_tests_properties(build_${test_exe} PROPERTIES FIXTURES_SETUP ${test_exe})
gtest_discover_tests(${test_exe}
TEST_LIST list
WORKING_DIRECTORY ${test_dir}
PROPERTIES DEPENDS build_${test_exe}
PROPERTIES FIXTURES_REQUIRED ${test_exe}
)
endforeach()
但似乎我试图在测试之间声明的依赖关系没有被考虑在内:测试的构建不一定发生在底层测试的执行之前......
如果我在下面使用旧gtest_add_tests
的而不是gtest_discover_tests
,它可以工作:
gtest_add_tests(
TARGET ${test_exe}
SOURCES ${test_src}
WORKING_DIRECTORY ${test_dir}
TEST_LIST tlist
)
set_tests_properties(${tlist} PROPERTIES FIXTURES_REQUIRED ${test_exe})
我错过了什么gtest_discover_tests
吗?
解决方案
开始赏金后,我自己重新开始了研究。我发现,最简单的方法是在googletest
系统范围内安装。
所以,首先安装包。在 Ubuntu 18.04 上,这是supt apt install googletest
.
出于某种原因,我不得不构建库(尽管可能没有必要?):
cd /usr/src/googletest
mkdir bin && cd bin
cmake ..
make && make install
之后,我已经能够编译并运行一个测试用例。我的CMakeLists.txt
测试部分如下所示:
enable_testing()
find_package(GTest REQUIRED)
include(GoogleTest)
add_executable(tests tests/foo_test.cpp tests/bar_test.cpp)
target_link_libraries(tests GTest::GTest GTest::Main)
gtest_discover_tests(tests)
在我的项目中,一个最小的测试用例文件如下所示:
// tests/foo_test.cpp
#include "gtest/gtest.h"
TEST(Foo, Sum)
{
EXPECT_EQ(2, 1 + 1);
}
编译很简单:
mkdir bin && cd bin
cmake ..
./tests
推荐阅读
- django - Django Admin 自定义内联模型
- list - 如何通过列表中的索引从元组中选择元素?
- java - 将 JAR 放入 JVM 库与项目库有什么区别?
- android - 如何使用 ffpeg 在视频上正确添加适合 XY 的水印图像
- python - 如何读取和操作字典和文件 python 2.7
- excel - Excel Range.Find 没有按照我想象的方式工作
- pdf - 使用 Itext 填充 PDF 字段
- laravel - Laravel 配置:清除导致崩溃
- webstorm - WebStorm,无法抑制对未定义函数的检查
- java - 在 IntellIJ 中找不到 javafx 的依赖项