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

如何按层级顺序运行Cargo测试?实现测试组串行、子测试并行

自定义层级的串行+并行混合测试执行方案

需求核心

  • proxy/v1_specific下的test1/test2/test3必须按顺序串行执行,但单个测试内部的子测试允许并行
  • 需要通过--magic=level参数一键触发不同层级的测试集合:
    • --magic=1:串行执行test1→test2→test3
    • --magic=2:串行执行指定子测试集合:test1::subtest1、test1::subtest2、test2::subtest1、test3::subtest1

实现方案:Shell脚本自定义参数

直接用脚本解析--magic参数,逐个执行对应测试集合,每个测试内部保留默认并行能力:

脚本代码

#!/bin/bash

# 初始化变量
MAGIC_LEVEL=0
CARGO_ARGS=()

# 解析命令行参数
while [[ $# -gt 0 ]]; do
  case "$1" in
    --magic=*)
      MAGIC_LEVEL="${1#*=}"
      shift
      ;;
    *)
      CARGO_ARGS+=("$1")
      shift
      ;;
  esac
done

# 匹配magic层级对应的测试列表
case "$MAGIC_LEVEL" in
  1)
    TESTS=(
      "v1_specific::test1"
      "v1_specific::test2"
      "v1_specific::test3"
    )
    ;;
  2)
    TESTS=(
      "v1_specific::test1::subtest1"
      "v1_specific::test1::subtest2"
      "v1_specific::test2::subtest1"
      "v1_specific::test3::subtest1"
    )
    ;;
  *)
    echo "错误:无效的--magic层级,请使用1或2"
    exit 1
    ;;
esac

# 串行执行每个测试,内部子测试默认并行
for TEST in "${TESTS[@]}"; do
  echo "=== 开始执行测试:$TEST ==="
  cargo test --package tests --test proxy "$TEST" "${CARGO_ARGS[@]}"
  # 若上一个测试失败,可取消注释以下代码终止后续执行
  # if [ $? -ne 0 ]; then
  #   echo "测试$TEST失败,终止后续执行"
  #   exit 1
  # fi
done

使用方法

  1. 保存脚本为cargo-magic-test.sh,添加执行权限:
    chmod +x cargo-magic-test.sh
    
  2. 执行对应层级测试:
    • 层级1:./cargo-magic-test.sh --magic=1
    • 层级2:./cargo-magic-test.sh --magic=2
  3. 可附加其他Cargo参数(比如--release、--verbose):
    ./cargo-magic-test.sh --magic=1 --release --verbose
    

优化:转为Cargo自定义命令

把脚本放到~/.cargo/bin/目录下,并命名为cargo-magic-test(去掉.sh后缀),之后就可以像原生Cargo命令一样使用:

cargo magic-test --magic=1

关键说明

  • 每个单独的cargo test命令默认会并行执行内部子测试,无需额外配置,正好满足「顶层测试串行,内部子测试并行」的需求
  • 若需要调整单个测试的并行度,可在脚本的cargo test命令后添加--jobs=N参数(比如--jobs=4指定4线程并行)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:52:29