mcpField
T
tui-tests

tui-tests

github.com/gitbutlerapp测试与质量21.9k41 次安装今天更新
代码仓库

关于 tui-tests

面向 `but` 项目状态 TUI 的 Rust 测试技能,介绍现有测试框架、输入模拟、快照断言和测试命令,供项目贡献者使用。

主要功能

  1. 01配置 TUI 测试框架
  2. 02模拟按键和文本输入
  3. 03使用快照断言渲染结果
  4. 04运行 TUI 测试的指南

适用场景

  1. 01为 TUI 行为添加测试
  2. 02检查光标和选择状态
  3. 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