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

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脚本实现失败触发。

步骤:

  1. 定义两个测试:
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)
  1. 编写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()
  1. 执行顺序:先跑脚本,再跑系列测试
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:42:03