enable_testing()在cmake中做了什么?

inf*_*guy 13 unit-testing cmake

我看到要添加我的google测试(对于我的cpp项目),我需要在根源目录中调用enable_testing().有人可以解释这是真的吗?另外为什么cmake不会使这个默认?

这是我从文档中可以得到的全部内容.

启用此目录及以下的测试.另请参见add_test()命令.请注意,ctest期望在构建目录根目录中找到测试文件.因此,此命令应位于源目录根目录中.

Ste*_*mer 9

它在生成器中设置了一个定义CMAKE_TESTING_ENABLED,如果没有定义,它允许cmake跳过很多与ctest注册单元测试相关的额外处理.(例)

这样做的主要好处是,它允许您在调用cmake时有选择地启用/禁用构建文件中的测试生成.

例如,您可以将以下代码段放在根目录中CMakeLists.txt file:

它创建了一个启用测试的选项,默认情况下是关闭的.

option(ENABLE_TESTS "Enable tests" OFF)
if (${ENABLE_TESTS})
    enable_testing()
endif()
Run Code Online (Sandbox Code Playgroud)

您只需要在您的根目录中执行此操作,CMakeLists.txt您可以愉快地调用其他cmake文件add_test()等,而无需担心if (${ENABLE_TESTS})每次都检查


Jus*_*tin 8

当你打电话时add_test(...),除非enable_testing()被叫,否则CMake不会生成测试.请注意,您通常不需要直接调用它.只是include(CTest)它会为你调用它.

我的CMake设置通常如下所示:

include(CTest) # note: this adds a BUILD_TESTING which defaults to ON

# ...

if(BUILD_TESTING)
  add_subdirectory(tests)
endif()
Run Code Online (Sandbox Code Playgroud)

tests目录中:

# setup test dependencies
# googletest has some code they explain on how to set it up; put that here

add_executable(MyUnitTests
    # ...
)

target_link_libraries(MyUnitTests gtest_main)

add_test(MyUnitTestName MyUnitTests)
Run Code Online (Sandbox Code Playgroud)

  • 既然`include(CTest)`内部调用了`enable_testing()`,是否意味着手动调用`enable_testing()`就没有意义了? (2认同)