【发布时间】:2016-04-18 14:41:59
【问题描述】:
我正在尝试将通过测试作为构建过程的一部分。
这里我使用add_custom_command 作为POST_BUILD 步骤运行测试。
function(register_test NAME)
add_test(${NAME} ${NAME})
# make the test run as part of the build process
add_custom_command(TARGET ${NAME} POST_BUILD COMMAND ${NAME})
endfunction()
这种方法的问题在于只有在构建目标时才会运行测试:
$ make
[ 50%] Built target lib1 Linking CXX executable ../../Debug/bin/lib1_test Running 1 test case... main.cpp(8): fatal error: in "lib1_test": critical check lib1() == "lib1" has failed [error != lib1] *** 1 failure is detected in the test module "Master Test Suite" make[2]: *** [lib1/test/lib1_test] Error 201 make[1]: *** [lib1/test/CMakeFiles/lib1_test.dir/all] Error 2 make: *** [all] Error 2
如果不需要构建目标,则不运行测试,构建通过。
这里我不做任何更改,只是重新运行构建过程
$ make
[ 50%] Built target lib1 [100%] Built target lib1_test
但是,如果 lib1_test 实际运行,则测试失败。
$ ./lib1/test/lib1_test
Running 1 test case... main.cpp(8): fatal error: in "lib1_test": critical check lib1() == "lib1" has failed [error != lib1] *** 1 failure is detected in the test module "Master Test Suite"
更好的方法是创建一个lib1_test.passed 目标,该目标依赖于lib1_test,运行测试,并且仅在测试通过时创建。
我尝试过的:
我曾尝试使用add_custom_target 创建一个依赖于lib1_test 的目标lib1_test.passed,如果成功,则创建一个文件lib1_test.passed:
add_custom_target(${NAME}.passed
DEPENDS ${NAME}
COMMAND ${NAME}
COMMAND ${CMAKE_COMMAND} -E touch ${NAME}.passed)
我目前取得的成绩有两个不足:
- 测试的运行不是正常构建过程的一部分。
也就是说,make不会“构建”lib1_test.passed;
我必须明确声明make lib1_test.passed -
make lib1_test.passed将始终执行lib1_test,无论lib1_test.passed是否比lib1_test1更新
问题:
我怎样才能让测试的运行成为构建的一部分,失败的测试总是会重新运行?
【问题讨论】:
-
未如愿以偿,即使不改也要运行
lib1_test?它得到不同的输入数据或者什么,如果它没有改变为什么需要重新运行? -
否 - 与此相反 - 我希望
lib1_test作为make的一部分运行,如果通过,再次输入make不会运行考试。但是,如果失败,再次输入make必须再次运行测试。 -
那么你只需要依赖二进制文件
lib1_test的add_custom_target,如果失败则删除这个二进制(可执行)文件,为什么不试试这样的变种? -
@user1034749 我的
add_custom_target调用不会在我输入make时自动被调用 - 如何让它运行?