资讯动态

EffectCraft 测试体系详解:从 cargo test 到 xtask ci 的全栈质量门禁

发布时间:2026/10/9 2:40:44 来源:尧图企业网站定制
【免费下载链接】effectcraft项目地址https://gitcode.com/gh_mirrors/ef/effectcraft点击查看免费下载EffectCraft 是一个用 Rust 编写的合成/后期软件其测试体系围绕两条命令构建cargo test --workspace跑全仓库测试cargo xtask ci则串起格式检查、Clippy、测试、依赖分层、资产归属与 wasm 交叉编译的完整 CI 门禁。本文基于 docs/testing.md 并结合仓库源码展开覆盖六大类测试引擎命令、渲染、特效、导出、自动化、界面的测试策略与关键实现最后讲解无窗口 UI 快照与性能基准这两个实战工具读完你可以完整复现项目的质量验证流程并理解每类测试背后的设计动机。两条命令日常测试与 CI 门禁官方给出的两条核心命令见 docs/testing.mdcargo test --workspace # everything cargo xtask ci # fmt, clippy -D warnings, tests, layers, assets, wasmcargo xtask ci的完整流水线ci子命令由 xtask/src/main.rs 中的ci()函数实现它依次执行五步任何一步失败即中止cargo fmt --check—— 格式检查cargo clippy --workspace --all-targets --release -- -D warnings—— 全 workspace、全目标含测试与示例的 Clippy 检查且把警告提升为错误-D warnings以 release profile 编译cargo test --workspace --release—— 以 release 模式运行全部测试与 CI 环境一致排除 debug 模式的优化差异干扰layers()—— 依赖分层检查xtask/src/main.rs 中的LAYERS表把 36 个 crate 划入 L0–L6 七层例如render、export、gpu在 L3engine、script、host在 L4ui-egui、automation在 L5三个 app 在 L6检查所有 workspace 内部依赖只能向下指、同层依赖必须在SAME_LAYER白名单内、L5 以下不得依赖egui/eframe/winit/cpal/muda等 UI/OS 类库。这套规则对应 docs/architecture.md 的分层约定assets()—— 资产归属检查每个图片/字体/音视频资产必须带.attribution侧车文件含asset、title、author、source、license、added六个必填字段且列在 ATTRIBUTION.md 中wasm()—— 对 L0–L4 的所有 crate 加上effectcraft-ui-egui、effectcraft-web执行cargo check --target wasm32-unknown-unknown保证核心代码可编译进 Web 版本。也就是说cargo xtask ci是「测试」与「架构守护」的统一入口即使测试全绿依赖分层违规或资产缺失同样会让 CI 失败。测试覆盖了什么引擎命令crates/engine/src/tests*.rs引擎层约 40 个tests_*.rs文件如 tests.rs、tests_menu_cmds.rs、tests_essential.rs覆盖每一个命令族包括undo/redo 语义每条命令族都验证撤销/重做行为。tests_menu_cmds.rs 的头部注释明确其目标是「menu-parity command familiesLayer / Edit / Animation / File / Composition / View 菜单including undo」菜单-命令一致性registry 级的检查保证每一个菜单项都能解析到一个已注册的命令即 UI 上点得到的功能在命令层一定有实现会话级行为测试通过Session::default()s.execute(file.openDemoProject, ...)打开内置 demo 工程再断言例如 tests.rs 的demo_opens_and_renders验证 demo 工程渲染出 480×270 且超过 10 万个不透明像素add_item_at_a_stack_index_and_time则验证layer.addItem的 1 基索引与最近帧对齐1.01s → 1.0s。渲染crates/render渲染 crate 对小型合成做像素级断言覆盖混合模式、遮罩、matte、时间重映射time remapping、3D 投影、光照与阴影。文档特别强调快速路径必须与参考实现一致源码中可直接对应crates/engine/src/tests.rs 的demo_layer_cache_is_transparent在同一时间点带层缓存layer cache与不带缓存地渲染要求逐像素差小于1e-6并且来回擦洗[0.5, 1.0, 3.0, 3.0334, 6.0, 3.0, 0.5]含反向 seek与通过命令层编辑后都成立 —— 这就是「层缓存快速路径」的正确性证明crates/render/tests.rs 及tests_*.rs系列tests_collapse.rs、tests_roi.rs、tests_mask_blur.rs、tests_time.rs、tests_color.rs等分别针对合成折叠、ROI 裁剪、遮罩模糊、时间合成、色彩管线做像素检查。特效crates/effects确定性 行为 黄金哈希特效 crate 的测试有三层结构确定性测试每个特效都有确定性子测试同参数同输入必得同输出行为测试至少一个行为断言 —— 中性参数下输出与输入一致identity、已知像素结果、或仿真类特效「直接 seek 到某帧」与「播放到该帧」得到相同画面验证仿真缓存的可回放性注册表级检查crates/effects/src/lib.rs 附近存在全 registry 遍历凡读取时钟clock的特效必须声明为 time-dependent由is_time_dependent判定否则测试失败 —— 这防止了「读时钟却未声明时间依赖」这类会导致缓存/磁盘缓存失效的隐性 bug。其中最重的是黄金哈希测试 crates/effects/tests/sim_golden.rs其文件头部注释给出了精确的测试设计针对与 GPU共享逐帧 plan 的 CPU 仿真特效CC Rainfall / Snowfall / Star Burst / Hair、Wave World、Foam 的 sprite planShatter、Card Dance、Card Wipe 的 piece planCC Bubbles / Drizzle / Mr. Mercury 的闭式列表Caustics 的 setup即文档所说「CC Rainfall … Card Wipe」在默认与非默认参数、多个时间点含穿越仿真缓存反向 seek、8 bpc 管线输入输出钳制量化与32 bpc 管线overbright 输入、原始输出、全分辨率与半分辨率下各渲染一帧基准尺寸 64×48每帧像素用FNV-1a 对f32位模式求哈希并与钉住的黄金值比对这些特效 CPU 输出发生任何微小变化都会使测试失败由于哈希是精确f32位模式依赖平台 libm目前钉在 aarch64 macOSCI 门禁运行平台其他平台上测试退化为「每个 case 渲染确定性」检查重新钉值流程有意修改 CPU 输出后设SIM_GOLDEN_PRINT1运行测试打印新哈希表SIM_GOLDEN_OUTdir还会把每帧原始像素f32小端 RGBA写出便于逐像素排查差异。导出crates/exportcrates/export/tests 下每个格式都有往返测试roundtrip.rs通用、vp9_roundtrip.rs、hevc_av1_roundtrip.rs、opus_roundtrip.rs音频。策略是每个格式都编码再解码回来核对帧数、尺寸与像素。roundtrip.rs 头部注释写明当系统安装了ffmpeg/ffprobe时把它们用作外部仲裁outside check——用ffprobe校验文件元数据、用ffmpeg把第 k 帧解码为 PNG 与自家解码结果比对未安装时这些 case 直接跳过。关键边界是ffmpeg 绝不被链接或随产品分发它只是可选的外部校验工具。自动化crates/automation effectcraft-clicrates/automation/src/tests.rsMCP 协议往返测试进程内无头与**假控制通道bridge/TCP**两种形态直接构造 JSON-RPC 请求行、断言result与isErrorapps/effectcraft-cli/tests/cli.rs验证命令行工具的 JSON 输出契约另有qa_template.rs提供 QA 模板。界面crates/ui-eguiUI 层使用egui_kittest 做无头测试crates/ui-egui/tests/ui_panels.rs 展示其典型写法 —— 用Harness::builder().with_size(...).build_eframe(...)构建真实EffectcraftApp通过window.panel命令打开面板再用 kittest 的Queryable按 automation id 查找控件、注入PointerMoved/PointerButton事件并run_steps。tests/下 20 个文件ui_render_queue.rs、ui_keyframes.rs、ui_scriptui.rs等覆盖各面板与对话框。依赖声明在 crates/ui-egui/Cargo.tomlegui_kittest启用eframe与wgpu特性。无窗口查看界面snapshot 示例当窗口不可用CI、无显示器、后台 Agent时可用 headless 快照示例查看真实 UI文档给出的最小用法cargo run -p effectcraft-ui-egui --example snapshot -- --out ui.png \ --step {method:engine.execute,params:{command:layer.select,params:{layers:[#2]}}}每个--step是一次控制通道control channel请求按顺序执行、之间留出 settle 时间特殊方法{method:snap,params:{path:x.png}}会额外写出一张中间快照。回复以 JSON 行打印到 stdout。crates/ui-egui/examples/snapshot.rs 的完整参数面比文档示例更宽值得收藏参数默认值说明--out fileui.png最终截图输出路径--size WxH1680x1020窗口逻辑尺寸--scale f2像素比HiDPI--settle secs1.5每步之间的沉降时间让后台帧渲染落到预览窗口--empty关不自动打开 demo 工程默认会执行file.openDemoProject--step json—单个控制通道请求可重复--script f.jsonl—每行一个 JSON 请求的脚本文件//开头行为注释示例还支持一个额外方法{method:pointer,params:{x:..,y:..,click:true}}直接向 harness 注入真实指针事件 —— 因为菜单与弹窗需要真实输入事件才能触发见 snapshot.rs。控制协议的完整方法清单见 docs/control-protocol.md。实现上有两点细节应用通过EffectcraftApp::new(session).with_control(rx)接收ControlRequest请求在后续帧才被应答部分请求要等输入处理完settle()循环调用step_frame并休眠 30ms 直到墙钟时间流逝确保 GPUwgpu后台帧真正渲染出来。性能基准bench 命令文档给出的基准用法cargo run --release -p effectcraft-cli -- bench --n 10 --play 30它输出单帧的逐层与逐特效耗时以及带/不带层缓存的播放耗时。apps/effectcraft-cli/src/main.rs 的头部注释给出了完整参数表bench [--comp C] [--time S] [--scale K] [--n N] [--play N] [--gpu [--adv3d]] 渲染耗时 bench --ops [--small] [--layers N] [--comps N] [--footage N] 日常操作耗时对应实现benchmain.rs同一帧无缓存渲染 N 次输出墙钟 min/median 与全线程 CPU min再按层缩进打印每层process/composite毫秒与每个特效的最小耗时bench_playmain.rs从t起连渲 N 帧分别以no cache与layer cache两种方式各跑一遍并对比均值最后打印层缓存统计hits / misses / entries / MBbench --gpu额外构建一个叠满 GPU 特效Gaussian Blur、Levels、Vibrance、Glow的调整图层合成以及可选--adv3d的 Advanced 3D 场景1920×1080含 PBR 几何体、景深相机、运动模糊用于 GPU 路径计时bench --ops在一个大型生成工程默认 200 个合成、5000 层上计时日常操作打开、擦洗等 UI 操作--small可缩小规模。注意前提bench 走--release构建且计时使用「一次预热 N 次取中位数」time_ms辅助函数以抵消预热抖动。小结测试策略的设计取向从文档与源码可以归纳出 EffectCraft 测试体系的四个取向正确性靠像素断言渲染、特效、导出都以「像素与参考一致」为第一标准缓存与快速路径必须与无缓存参考路径逐像素一致确定性是一等公民仿真特效钉f32位模式黄金哈希平台限定 aarch64 macOSseek 与播放结果必须相同外部工具零耦合ffmpeg/ffprobe 仅作可选外部仲裁永不链接、永不分发架构规则进 CI依赖分层、资产归属、wasm 可编译性都在cargo xtask ci中强制执行测试通过之外还有结构性约束兜底。复现完整门禁只需一条命令cargo xtask ci只想跑测试则用cargo test --workspaceCI 使用--release。赞分享【免费下载链接】effectcraft项目地址https://gitcode.com/gh_mirrors/ef/effectcraft点击查看免费下载相关推荐IronClaw 测试体系完全指南从三层测试策略到 CI/CD 质量门禁IronClaw 测试体系完全指南从三层测试策略到 CI/CD 质量门禁 本篇技术指南系统讲解 Agent OS 项目 IronClaw 的完整测试体系包括人工智能AI 应用交互助手AI AgentStaffML Vault 测试体系全解从测试金字塔到 CI 门禁的工程化质量防线StaffML Vault 测试体系全解从测试金字塔到 CI 门禁的工程化质量防线 本文是 StaffML Vault 数据管线 vault cli 命令行教育教程人工智能机器学习Photocraft 测试体系详解从包级测试到 CI 门禁的完整验证策略Photocraft 测试体系详解从包级测试到 CI 门禁的完整验证策略 Photocraft 是一个纯 Rust 编写的开源 Photoshop 级图像编辑图像处理桌面应用上一篇TVM Tirx CUDA 元素级 Tile 原语elementwise深度解析reg 与 smem 双变体派发机制下一篇Rundeck Java Step 插件开发实战从 Workflow Step 到 Remote Script Node Step基于 example-java-step-plugin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑