cmake 3.23.1:如何在首次ctest失败后触发备用下载测试?
CTest失败时触发备用资产下载的实现方案
核心结论
CTest没有原生的“失败触发”依赖机制,但可以通过以下几种方式实现需求,适配你的CMake 3.23.1版本:
1. 合并成单个测试脚本(最推荐)
把主站点下载和备用站点下载逻辑写到同一个脚本里,让脚本内部处理失败跳转,简单可控。
示例Shell脚本(download_assets.sh):
#!/bin/bash # 尝试主站点下载 wget -O assets.zip https://primary-site.com/assets.zip if [ $? -ne 0 ]; then echo "主站点下载失败,切换到备用站点" # 尝试备用站点 wget -O assets.zip https://fallback-site.com/assets.zip if [ $? -ne 0 ]; then echo "备用站点也失败,退出" exit 1 fi fi # 可选:验证资产完整性 unzip -t assets.zip exit $?
CMake配置:
add_test(NAME DownloadAssets COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/download_assets.sh) # 标记此测试为系列测试的前置夹具 set_tests_properties(DownloadAssets PROPERTIES FIXTURES_SETUP AssetFixture) # 让所有系列测试依赖这个夹具 set_tests_properties(SeriesTest1 SeriesTest2 SeriesTest3 PROPERTIES FIXTURES_REQUIRED AssetFixture)
这里用到的FIXTURES_SETUP/FIXTURES_REQUIRED在CMake 3.7+就支持,你的3.23.1完全兼容,能保证系列测试只有在下载成功后才执行。
2. 拆分两个测试,用CTest脚本触发备用
如果必须拆成独立的主/备用测试,可以通过自定义CTest脚本实现失败触发。
步骤:
- 定义两个测试:
add_test(NAME DownloadPrimary COMMAND wget -O assets.zip https://primary-site.com/assets.zip) add_test(NAME DownloadFallback COMMAND wget -O assets.zip https://fallback-site.com/assets.zip)
- 编写CTest脚本(
run_downloads.cmake):
# 运行主下载测试 ctest -R DownloadPrimary --output-on-failure # 读取测试结果日志,判断是否失败 file(READ "${CMAKE_BINARY_DIR}/Testing/Temporary/LastTest.log" test_log) string(FIND "${test_log}" "PASSED" pass_flag) if(pass_flag EQUAL -1) message("主下载失败,启动备用下载") ctest -R DownloadFallback --output-on-failure endif()
- 执行顺序:先跑脚本,再跑系列测试
ctest -S run_downloads.cmake ctest -R SeriesTests
关于FIXTURES和RESOURCE_LOCK的说明
FIXTURES_REQUIRED/FIXTURES_SETUP:只负责管理测试的依赖顺序,确保系列测试在下载测试后执行,但本身不支持失败触发逻辑,需要配合脚本或合并测试使用。RESOURCE_LOCK:用于控制多个测试对共享资源的访问(比如避免同时下载),和你的需求无关,不需要启用。
额外优化建议
- 给主下载测试加重试次数,减少触发备用的频率:
set_tests_properties(DownloadPrimary PROPERTIES RETRY_COUNT 2) # 自动重试2次主站点
- 增加资产哈希校验,避免下载损坏文件影响后续测试:
# 在脚本里添加校验 EXPECTED_HASH="abc123def456..." ACTUAL_HASH=$(sha256sum assets.zip | cut -d' ' -f1) if [ "$ACTUAL_HASH" != "$EXPECTED_HASH" ]; then echo "资产校验失败,重新下载" # 重试或切换备用站点 fi
内容的提问来源于stack exchange,提问作者Benjamin Johnson
相关产品推荐
相关产品推荐

