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 test
function方便,因为它使您可以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(可选)和运行可执行目标。