用途:在 Zed 中编写、调试或复现 GPUI 测试,处理 #[gpui::test]、测试种子与迭代、确定性调度器失败、parking/pending 任务失败以及 flaky 测试复现。
主要能力:#[gpui::test] 展开为普通 Rust #[test],可在 cargo test、cargo nextest 下运行;它把测试体包进 GPUI 确定性调度器,可用不同种子多次运行,种子控制任务交错与注入的 StdRng。支持同步与异步测试。按类型名识别参数:同步与异步支持 &TestAppContext、&mut TestAppContext、StdRng;仅异步支持 BackgroundExecutor;仅同步支持 &App、&mut App。属性参数支持无参(种子 0,除非设置 SEED)、seed = N、seeds(...)、iterations = N、retries = N、on_failure = "path::to::function";iterations 可与显式 seed/seeds 组合,显式种子追加到 0..iterations 范围;SEED 环境变量优先于显式种子,SEED=N 与 ITERATIONS=M 时运行 N..N+M。
环境变量:SEED=<u64> 选择调度器种子并复现 failing seed;ITERATIONS=<usize> 运行时覆盖 iterations;PENDING_TRACES=1 在 Parking forbidden 时打印 pending 任务轨迹;GPUI_RUN_UNTIL_PARKED_LOG=1 记录 allow_parking() 启用;DEBUG_SCHEDULER=1 打印调度器时钟/定时器调试;SCHEDULER_NONINTERACTIVE=1 抑制 scheduler::TestScheduler::many 的交互式种子输出。常用 Rust 变量:RUST_BACKTRACE、RUST_LOG、ZED_HEADLESS=1。
使用方式:先定位 crate 与测试名,运行 cargo -q test -p <crate-name> <test_name> -- --nocapture;已知失败种子时用 SEED=<seed> 重跑;flaky 无种子时用 ITERATIONS=100 扫描;Parking forbidden 时加 PENDING_TRACES=1。GPUI 测试中延时用 cx.background_executor().timer(duration).await,避免 smol::Timer::after。修复后先跑固定种子,再做适度种子扫描(如 ITERATIONS=20)。
适用场景:需要 TestAppContext、确定性执行器、假时间或调度器交错覆盖的测试。
限制:不要在修复测试时擅自增加 retries,除非用户明确要求或测试已说明概率容忍原因;不要假设测试顺序,除非运行器显式串行。