You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ctest中检查测试是否创建了指定文件

用CTest验证程序生成文件是否存在的实现方案

CTest本身没有直接检查文件存在的内置属性,但可以通过以下几种简单方式实现你的需求:

方法一:写个轻量验证脚本(跨平台通用)

先在项目里创建一个check_file_exists.cmake脚本,内容就几行:

if(NOT EXISTS "${ARGV0}")
  message(FATAL_ERROR "文件 ${ARGV0} 不存在!")
endif()

然后在CMakeLists.txt里配置两个测试:

# 第一步:执行你的程序,生成文件
add_test(NAME RunMyApp COMMAND myapp.exe)

# 第二步:检查文件是否存在,依赖第一步的测试完成
add_test(NAME CheckResJsonExists COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/check_file_exists.cmake $<TARGET_FILE_DIR:myapp>/res.json)
set_tests_properties(CheckResJsonExists PROPERTIES DEPENDS RunMyApp)

这样CTest会先跑RunMyApp生成文件,再执行检查脚本,文件不存在的话测试直接标失败。

方法二:单测试里整合执行与检查(无需额外脚本)

不想加脚本的话,可以直接用CMake命令行把程序执行和文件检查揉在同一个测试里:

add_test(NAME RunAndCheckMyApp COMMAND ${CMAKE_COMMAND} -E env "MYAPP_EXE=$<TARGET_FILE:myapp>"
  ${CMAKE_COMMAND} -P - <<EOF
execute_process(COMMAND \${MYAPP_EXE} RESULT_VARIABLE EXIT_CODE)
if(EXIT_CODE NOT EQUAL 0)
  message(FATAL_ERROR "程序退出码异常:\${EXIT_CODE}")
endif()
if(NOT EXISTS "res.json")
  message(FATAL_ERROR "res.json 未生成!")
endif()
EOF
)

这个测试会先执行你的程序,再检查文件,任何一步出问题都会标记测试失败。

方法三:用POST_TEST_SCRIPT属性(CMake 3.18及以上版本)

如果你的CMake版本够新(3.18+),可以用POST_TEST_SCRIPT属性让测试执行完自动跑检查:

add_test(NAME RunMyApp COMMAND myapp.exe)
set_tests_properties(RunMyApp PROPERTIES
  POST_TEST_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/check_file_exists.cmake
  POST_TEST_SCRIPT_ARGS $<TARGET_FILE_DIR:myapp>/res.json
)

这个属性会在RunMyApp测试结束后自动调用检查脚本,脚本里的错误会直接让原测试失败。


内容的提问来源于stack exchange,提问作者atrelinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:10:31