CMake&CTest:使testing不build立testing

我正在CMake中尝试CTest,以便使用make test target自动运行我的一些make test 。 问题是CMake不能“理解”我愿意运行的testing必须被build立,因为它是项目的一部分。

所以我正在寻找一种方法来显式指定这个依赖。

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

 add_test(TestName ExeName) add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} DEPENDS ExeName) 

然后你可以运行make check来编译并运行testing。 如果您有多个testing,那么您将不得不在上面的行中使用DEPENDS exe1 exe2 exe3 ...

实际上有一种使用make test 。 您需要将testing可执行文件的构build定义为testing之一,然后添加testing之间的依赖关系。 那是:

 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) 

我用了一个richq的答案。 在顶级CMakeLists.txt ,我添加了一个自定义目标build_and_test ,用于构build和运行所有testing:

 find_package(GTest) if (GTEST_FOUND) enable_testing() add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V) add_subdirectory(test) endif() 

test/下的各个子项目CMakeLists.txt文件中,我将每个testing可执行文件添加为build_and_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) 

使用这种方法,我只需要make build_and_test而不是make test (或者make all test ),而且它只有构buildtesting代码(及其依赖)的好处。 这是一个耻辱,我不能使用目标名称test 。 就我而言,这并不是什么糟糕的事情,因为我有一个顶层脚本,通过调用cmake make out-of-treedebugging和发布(以及交叉编译)构build,然后make ,并将test转换为build_and_test

显然,GTest的东西不是必需的。 我只是碰巧使用/像谷歌testing,并希望分享一个完整的例子,使用CMake / CTest。 恕我直言,这种方法也有利于我使用ctest -V ,它显示testing运行时的Googletesting输出:

 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 

如果你想模仿make check ,你可能会发现这个wiki条目有用:

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

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

节省你的头痛:

 make all test 

为我开箱即用,并在运行testing之前构build依赖关系。 鉴于这是多么简单,它几乎使本机make testfunction方便,因为它使您可以select运行最后的编译testing,即使您的代码被破坏。

以上所有答案都是完美的。 但是实际上CMake使用CTest作为testing工具,所以执行这个任务的标准方法(我认为是)是:

 enable_testing () add_test (TestName TestCommand) add_test (TestName2 AnotherTestCommand) 

然后运行cmake并build立目标。 之后,你可以运行make test ,或者直接运行

 ctest 

你会得到结果。 这在CMake 2.8下进行testing。

查看详情: http : //cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing

所有的答案都是好的,但是这意味着违背传统,通过命令make test来运行make test 。 我已经做了这个诀窍:

 add_test(NAME <mytest> WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>") 

这意味着testing包括构build(可选)和运行可执行目标。