使用带有新命令gtest_discover_tests的CMake / Ctest使用Google测试

jan*_*195 6 cmake googletest 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()
Run Code Online (Sandbox Code Playgroud)

但是似乎没有考虑我试图在测试之间声明的依赖项:测试的构建不一定在执行基础测试之前进行...

如果我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})
Run Code Online (Sandbox Code Playgroud)

我错过了什么gtest_discover_tests吗?

Vic*_*tor 10

在开始赏金之后,我重新开始了自己的研究。我发现,最简单的方法是在googletest系统范围内安装。

所以,首先安装这个包。在 Ubuntu 18.04 上,这是supt apt install googletest.

出于某种原因,我不得不建立图书馆(也许不知何故没有必要?):

cd /usr/src/googletest
mkdir bin && cd bin
cmake ..
make && make install
Run Code Online (Sandbox Code Playgroud)

之后,我已经能够编译和运行测试用例。我的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)
Run Code Online (Sandbox Code Playgroud)

在我的项目中,最小的测试用例文件如下所示:

// tests/foo_test.cpp

#include "gtest/gtest.h"

TEST(Foo, Sum)
{
  EXPECT_EQ(2, 1 + 1);
}
Run Code Online (Sandbox Code Playgroud)

编译很简单:

mkdir bin && cd bin
cmake ..
./tests
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止我在互联网上找到的关于使用 CMake 和 GoogleTest 的最好的最小示例。大多数示例都非常嘈杂,包含多种下载和安装方法、复杂的用例和自定义构建标志。 (3认同)
  • 对我来说,问题是忘记了“enable_testing()”。定义完毕后,ctest 成功运行。 (2认同)