CMake&CTest:make test不构建测试

cla*_*laf 83 dependencies cmake ctest

我在CMake中尝试CTest,以便使用make testtarget 自动运行我的一些测试.问题是CMake没有"理解"我愿意运行的测试必须构建,因为它是项目的一部分.

所以我正在寻找一种明确指定这种依赖关系的方法.

ric*_*chq 71

可以说CMake中的一个错误(此前已在此处跟踪),这不是开箱即用的.解决方法是执行以下操作:

add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
                  DEPENDS ExeName)
Run Code Online (Sandbox Code Playgroud)

然后你可以运行make check它将编译并运行测试.如果你有几个测试,那么你必须DEPENDS exe1 exe2 exe3 ...在上面的行中使用.

  • 实际上,有些人认为cmake的一个功能(不是bug)你可以运行"make test"并且只是*运行*测试,因为它们没有先进行任何重新构建...... (4认同)
  • 所以我猜想“make test”目标将保持未使用状态,因为似乎您必须在 add_custom_target 命令中选择不同的目标名称? (2认同)
  • @rq - 但我怎么能用多个项目做这个(当一个CMakeLists.txt是其他的子项目时)所以每个人都会定义`check`目标并且它们可能会发生碰撞 (2认同)
  • @Artyom - 在这种情况下,你可能更好地使用等效的"make all test".事实上,这就是我所做的. (2认同)

小智 49

实际上有一种使用方法make test.您需要将测试可执行文件的构建定义为其中一个测试,然后在测试之间添加依赖项.那是:

ADD_TEST(ctest_build_test_code
         "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target test_code)
ADD_TEST(ctest_run_test_code test_code)
SET_TESTS_PROPERTIES(ctest_run_test_code
                     PROPERTIES DEPENDS ctest_build_test_code)
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一一个可以扩展的,并且不会强制您构建"make all"目标只是为了运行测试.可能的缺点:二进制文件上的构建错误的详细信息仅显示在生成的LastTest.log文件中,而不显示在stdout/stderr上 (11认同)
  • 好答案!您应该将配置添加到构建目标.否则,无法在所有配置中运行测试.add_test(名称"$ {ARGV0} _BUILD"命令"$ {CMAKE_COMMAND}" - 构建$ {CMAKE_BINARY_DIR} --target $ {target}" - config""$ <CONFIG>") (2认同)
  • 这用一堆虚假的测试阻塞了测试报告员。 (2认同)

Tre*_*son 13

我使用了richq的答案变体.在顶层CMakeLists.txt,我添加了一个自定义目标build_and_test,用于构建和运行所有测试:

find_package(GTest)
if (GTEST_FOUND)
    enable_testing()
    add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
    add_subdirectory(test)
endif()
Run Code Online (Sandbox Code Playgroud)

在下面的各个子项目CMakeLists.txt文件中test/,我将每个测试可执行文件添加为依赖项build_and_test:

include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)
Run Code Online (Sandbox Code Playgroud)

使用这种方法,我只需要make build_and_test代替make test(或make all test),它只有构建测试代码(及其依赖项)的好处.遗憾的是我无法使用目标名称test.在我的情况下,它并没有那么糟糕,因为我有一个顶级脚本,通过调用cmake然后进行树外调试和发布(和交叉编译)构建make,并转换testbuild_and_test.

显然,GTest的东西不是必需的.我碰巧使用/喜欢Google Test,并希望分享一个与CMake/CTest一起使用它的完整示例.恕我直言,这种方法也有允许我使用的好处ctest -V,它在测试运行时显示Google Test输出:

1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN      ] proj1.dummy
1: [       OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [  PASSED  ] 1 test.
1/2 Test #1: proj1_test .......................   Passed    0.03 sec
Run Code Online (Sandbox Code Playgroud)


Joh*_*man 8

如果您使用 CMake >= 3.7,那么推荐的方法是使用fixtures

add_executable(test test.cpp)
add_test(test_build
  "${CMAKE_COMMAND}"
  --build "${CMAKE_BINARY_DIR}"
  --config "$<CONFIG>"
  --target test
)
set_tests_properties(test_build PROPERTIES FIXTURES_SETUP    test_fixture)
add_test(test test)
set_tests_properties(test       PROPERTIES FIXTURES_REQUIRED test_fixture)
Run Code Online (Sandbox Code Playgroud)

这将执行以下操作:

  • 添加test从构建的可执行目标test.cpp
  • 添加test_build运行 Cmake 以构建目标的“测试”test
  • test_build测试标记为夹具的设置任务test_fixture
  • 添加一个test只运行test可执行文件的测试
  • 标记test测试需要fixture test_fixture

因此,每次test运行 test 时test_build,它首先运行 test ,它构建必要的可执行文件。


小智 6

如果您尝试模拟make check,您可能会发现此Wiki条目有用:

http://www.cmake.org/Wiki/CMakeEmulateMakeCheck

我刚刚检查过它是否成功(CMake 2.8.10).


qua*_*ant 6

免得自己头疼:

make all test
Run Code Online (Sandbox Code Playgroud)

对我来说开箱即用,并将在运行测试之前构建依赖项。鉴于这是多么简单,它几乎使本机make test功能变得方便,因为即使您的代码被破坏,它也为您提供了运行最后编译测试的选项。

  • 如果您想要并行构建,也不能很好地工作,因为两者将并行运行:您需要 `make -j4 all &amp;&amp; make test`。而且使用非 Make 构建工具也很不稳定。 (3认同)