我想通過測試構建過程的一部分。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