#gtk #gnome #testing #api-bindings

gtk-test

用于测试GTK UIs的库

11个重大版本

0.18.0 2023年8月26日
0.17.0 2023年2月11日
0.16.0 2022年10月22日
0.15.0 2022年1月20日
0.1.0 2018年5月1日

1272GUI

Download history 4/week @ 2024-03-07 7/week @ 2024-03-14 52/week @ 2024-03-28 29/week @ 2024-04-04 17/week @ 2024-04-11 14/week @ 2024-04-18 3/week @ 2024-05-16 2/week @ 2024-05-23

344每月下载量
3 crates中使用

MIT许可证

30KB
311

gtk-test

此项目允许您测试GTK应用程序的UI。它必须与gtk-rs库一起使用。

它是如何工作的?

实际上非常简单(尽管在OSX上要执行一些额外操作才能按预期工作……)

gtk::init().unwrap(); // You need to init GTK otherwise it'll just crash...

然后像平时一样构建您的UI(使用Glade或手动)。唯一真正改变的是:您必须不要调用gtk::main

构建完UI后,只需调用gtk_test宏/函数来测试它。但有一点需要注意:有时,您需要为GTK处理某些事件留出时间。例如,如果您点击了一个按钮并且与之关联了动作,则更谨慎地使用gtk_test::wait

另一个推荐的做法是,如果您需要与之交互(例如,点击按钮或输入一些文本),请将焦点放在窗口上。

let w = gtk::Window::new();
// ...
w.activate_focus();

一般设置

在运行测试时,您需要指定只想要一个线程。为此

cargo test -- --test-threads=1

否则,GTK上下文可能会相互冲突。

针对OSX的特定设置

在OSX上还需要做一些操作才能使其工作。首先,您无法将#[test]属性添加到您的函数中,它不起作用。相反,您必须像编写常规二进制文件一样编写您的测试(因此以main函数作为入口点)。

一个简短的示例(完整版本可以在本存储库的tests文件夹中找到)

fn main() {
    let (w, l, b) = init_ui();

    assert_text!(l, "Test");
    w.activate_focus();
    gtk_test::click(&b);
    gtk_test::wait(1000); // to be sure that GTK has updated the label's text
    assert_text!(l, "Clicked");
}

然后您需要在您的Cargo.toml文件中添加以下内容

[[test]]
harness = false # This is the important line!
name = "basic"

这允许您的测试作为“常规”二进制文件运行。

示例?

您可以在测试文件夹中找到一些。只需复制粘贴即可,然后就可以使用了(别忘了在您的 Cargo.toml 文件中添加缺失的部分!)。

在持续集成(CI)中使用它吗?

实际上是可以的(仅测试了GitHub Actions)。您只需要一个显示服务器。以下是在您的CI配置文件中添加以使其工作的内容

安装以下软件包

  • libgtk-3-dev
  • libxdo-dev

然后使用 xvfb-action 在虚拟显示环境中运行应用程序。例如

- name: Run headless test
  uses: GabrielBB/xvfb-action@v1
  with:
    run: cargo test -- --test-threads=1

查看我们的 .github/workflows/linux_ci.yml 文件,了解我们是如何设置的。

依赖项

~18MB
~411K SLoC