关于 tui-tests
面向 `but` 项目状态 TUI 的 Rust 测试技能,介绍现有测试框架、输入模拟、快照断言和测试命令,供项目贡献者使用。
主要功能
- 01配置 TUI 测试框架
- 02模拟按键和文本输入
- 03使用快照断言渲染结果
- 04运行 TUI 测试的指南
适用场景
- 01为 TUI 行为添加测试
- 02检查光标和选择状态
- 03更新测试快照
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gitbutlerapp/ gitbutler --skill tui-tests安装后在 Claude Code 中输入/tui-tests确认已加载。
详细介绍
测试所在位置
- 主要的 TUI 测试:
crates/but/src/command/legacy/status/tui/tests/ - 测试工具和辅助函数:
crates/but/src/tui/test_utils.rs和crates/but/src/command/legacy/status/tui/tests/utils.rs - 快照:
crates/but/src/command/legacy/status/tui/tests/snapshots/
基本模式
#[test]
fn describes_behavior_under_test() {
let env = Sandbox::init_scenario_with_target_and_default_settings("one-stack").unwrap();
env.setup_metadata(&["A"]).unwrap();
let mut tui = test_status_tui(env);
tui.input_then_render(KeyCode::Down)
.assert_rendered_term_svg_eq(file!["snapshots/describes_behavior_under_test_001.svg"]);
}
操作 TUI
有用的输入示例:
tui.input_then_render(None); // render without inputs
tui.input_then_render('j'); // single char input
tui.input_then_render(KeyCode::Down); // special key
tui.input_then_render(Shift('j')); // keys with shift
tui.input_then_render(Control('j')); // keys with control
tui.input_then_render([KeyCode::Down, KeyCode::Down]); // multiple keys from array
tui.input_then_render("commit message text"); // multiple keys from string
tui.reload(); // reload state after making external changes
断言
通常优先使用
assert_current_line_eq(str![...])来测试光标/选择行为。assert_rendered_term_svg_eq(file!["snapshots/test_function_name_001.svg"])来测试其他所有内容。
通常应在每组逻辑相关的输入后添加一个 assert_rendered_term_svg_eq,
以便尽早发现错误状态。
使用 assert_rendered_contains 和 assert_rendered_not_contains 时要谨慎,
因为它们可能导致误报。这些断言适用于迭代测试时快照会造成过多变动的情况。
如需使用更专门的断言,请查看 crates/but/src/tui/test_utils.rs 和
crates/but/src/command/legacy/status/tui/tests/utils.rs。
不允许在 crates/but/src/tui/test_utils.rs 或
crates/but/src/command/legacy/status/tui/tests/utils.rs 中添加新的断言类型。请完全依赖
现有断言。
不要复用其他测试的快照。每个测试都应使用自己的快照。
避免使用 tui.env().invoke_git("...")。优先通过 TUI 执行操作。
运行测试
- 使用
cargo test -p but <test-name>运行单个测试。 - 使用
SNAPSHOTS=overwrite cargo test -p but <test-name>运行测试并更新 快照。 - 使用
cargo test -p but tui运行所有 TUI 测试。修改后请执行此命令。
如果测试失败,输出中会包含测试后端渲染出的状态。迭代编写测试时,可以利用此输出检查状态。
评论
支持 Markdown