用途:当 Bevy crate 需要单元测试或集成测试时使用。cargo test 运行带 #[test] 的函数;对调度逻辑,用仅含 MinimalPlugins 的无头 App 作为测试框架。
主要能力与用法:cargo test 编译并运行单元测试、集成测试与文档测试;cargo test name_filter 只运行名称包含过滤串的测试;-- 之后的参数传给 libtest(cargo test -- --help)。默认 cargo test 覆盖 lib、作为单元测试的 bin、集成测试和 doc test,并构建 examples;--lib 只测库。测试默认工作目录为包根目录。-- --no-capture 显示测试输出。
测试写法:构建 App,插入 resource,添加 system,调用 update,再从 world() 读取结果,用 MinimalPlugins 把窗口排除在测试框架外。纯逻辑保持普通 #[test],不用 App。例如在测试中:app.add_plugins(MinimalPlugins).insert_resource(Score(0)).add_systems(Update, add_point); 然后 app.update(),再断言 app.world().resource::<Score>().0。Startup 中 spawn 后再单步 Update,可通过 world() 查询计数。两个写同一组件的系统在测试中按游戏中相同方式用 .chain() 排序,如 (earn, spend).chain()。
适用场景:ECS 中按实体数据用 Component + Query,全局配置或时钟用 Resource,稳定模拟步进用 FixedMain 与 Fixed 时钟,初始 spawn 用 Startup 中的 Commands。
限制:该测试框架只包含 MinimalPlugins、app.update() 和 world(),不捕获帧、不注入窗口输入;不提供场景树测试运行器,不使用第三方 Bevy 测试 crate。借用规则要求两个同时可变查询同一组件的系统必须用 .chain() 排序或拆分,否则调度会并行运行。文档测试的工作目录规则与单元测试不同,不要假设 doctest 能像 #[test] 一样读取 assets/。文档 URL 不要固定 /0.20.0/,目标版本在正文中说明一次。不要凭空发明物理、导航、网络或 XR crate,只使用有文档的 Bevy crate 与模块。