我想通过测试构建过程的一部分。cmake:使测试成功通过构建过程的一部分
这里我使用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.passed
取决于lib1_test
尝试,如果成功,将创建一个文件lib1_test.passed
:
add_custom_target(${NAME}.passed
DEPENDS ${NAME}
COMMAND ${NAME}
COMMAND ${CMAKE_COMMAND} -E touch ${NAME}.passed)
有2个缺口与我目前取得的成果:
- 测试的运行不是正常构建过程的一部分。
也就是说,make
不会“build”lib1_test.passed
;
我要明确说明make lib1_test.passed
make lib1_test.passed
总会执行lib1_test
,无论lib1_test.passed
较新,lib1_test1
或不
问:
怎样才能让测试部分的运行的构建,一个失败的测试总是会重新运行?
拿不到你的愿望,你希望运行'lib1_test'甚至如果没有改变?它会得到不同的输入数据或什么,为什么需要重新运行,如果它没有改变? – fghj
否 - 与此相反 - 我希望'lib1_test'作为'make'的一部分运行,如果它通过,再次输入'make'将不会运行测试。但是,如果失败,请再次键入'make' **必须**再次运行测试。 –
然后你只需要'add_custom_target',这取决于二进制文件'lib1_test',并删除这个二进制(可执行)文件,如果失败,为什么你不尝试这样的变种? – fghj