如何修改CMakeLists.txt以自定义测试目标



我有一个复杂的项目——一棵大树,每个目录中都有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的测试听起来就是为了这个。

最新更新