我有一个复杂的项目——一棵大树,每个目录中都有CMakeLists.txt。
一旦cmake完成,Makefile
就具有状态为的test
目标
.PHONY test
test:
$(SHELL) -c
"$(CTEST) $(CTEST_FLAGS) --test-dir $(BUILD_PATH)"
问题是测试需要一些预设置(要创建临时目录、要设置环境变量等(。
因此,如果我使用一个干净的make
,我只会将Makefile
修改为:
.PHONY test
test:
$(SHELL) -c
"source $(BUILD_PATH)/setup_tests.sh &&
$(CTEST) $(CTEST_FLAGS) --test-dir $(BUILD_PATH)"
但是Makefile
是由cmake
创建的,我不知道在哪里定义这些更改。
根CCD_ 7具有一个函数调用CCD_。src/tests
目录有自己的CMakeLists.txt
,但它只是定义了一堆带有单独测试的子目录。
有人能为我指明如何在cmake
中自定义特定目标的执行方向吗?或者ctest
可以在所有测试之前运行shell脚本吗(-S
看起来很有前途,但它需要cmake的语言脚本?它不适用于.sh
(。
典型的CMake方法是使用测试属性:
set_tests_properties(mytest PROPERTIES
ENVIRONMENT "VAR1=val1;VAR2=val2;VAR3=val3"
)
与运行脚本来设置环境(而不是典型的CMake方式(一样,您可以简单地将命令设置为在可执行文件之前运行该脚本:
find_program(BASH_PROGRAM bash)
add_test(NAME mytest COMMAND
${BASH_PROGRAM} -c "source "${CMAKE_BUILD_DIR}/setup_tests.sh" && $<TARGET_FILE:myexec>"
)
创建这种逻辑的预期方法是为设置定义一个夹具测试:
为了方便起见,我们只是运行以下cmake脚本,允许我们指定消息,此外还允许我们指定测试是否失败,但您可以运行自己的bash脚本作为测试。
testscript.cmake
#[===[
Params:
MESSAGE: message to print
FAIL : fail the test?
]===]
if(FAIL)
message(FATAL_ERROR "${MESSAGE}")
else()
message(STATUS "${MESSAGE}")
endif()
CMakeLists.txt
enable_testing()
# the values of the FAIL parameter could be modified to to test different scenarios...
add_test(NAME Fixture COMMAND ${CMAKE_COMMAND} -D FAIL:BOOL=0 -D "MESSAGE:STRING=executing fixture" -P ${CMAKE_CURRENT_SOURCE_DIR}/testscript.cmake)
add_test(NAME Test COMMAND ${CMAKE_COMMAND} -D FAIL:BOOL=0 -D "MESSAGE:STRING=executing actual test" -P ${CMAKE_CURRENT_SOURCE_DIR}/testscript.cmake)
add_test(NAME Test2 COMMAND ${CMAKE_COMMAND} -D FAIL:BOOL=1 -D "MESSAGE:STRING=executing test without fixture" -P ${CMAKE_CURRENT_SOURCE_DIR}/testscript.cmake)
set_tests_properties(Fixture PROPERTIES FIXTURES_SETUP Setup)
set_tests_properties(Test PROPERTIES FIXTURES_REQUIRED Setup)
现在
ctest -R 'Test$' --verbose
执行Fixture
测试,如果此测试成功,则执行请求的实际测试(Test
(。
ctest -R Test2 --verbose
只执行Test2
。
您可以以类似的方式为测试添加清理逻辑。
一些预设置(要创建的临时目录、要设置的环境变量等(。
与其他答案中一样,使用set_tests_properties
设置环境变量。
您可以从CMake 创建带有FILE(MAKE_DIRECTORY
的目录
对于高级旅程,您可能想要发现测试夹具,这些夹具旨在";准备";测试的环境(而不是环境变量(,例如运行测试所需的服务。
如何自定义cmake中特定目标的执行?
add_test
接受一个命令,您可以运行任何需要的命令。
ctest是否可以选择在所有测试之前运行shell脚本
为什么所有测试?只需要运行shell-fixture的测试听起来就是为了这个。