SuperAPI AI 工具集

gpui-test

测试与质量

查看项目

更新于 10-15 14:34

技能介绍

用途

gpui-test 面向 GPUI 应用的测试编写。它适用于测试组件、异步操作或 UI 行为,也可用于测试分布式系统。其测试运行在单线程执行器上,提供确定性执行,并支持测试复杂的异步场景。

主要能力

GPUI 提供了一套测试框架,核心是 #[gpui::test] 属性,以及两种测试上下文:

  • TestAppContext:提供对 GPUI 核心功能的访问,不涉及窗口。可用于创建实体、更新实体、读取实体等操作。
  • VisualTestContext:在 TestAppContext 基础上扩展了窗口支持,可创建带组件的窗口,并访问窗口与组件。

测试属性支持多种形式:

  • 基础测试:#[gpui::test] fn my_test(cx: &mut TestAppContext)
  • 异步测试:#[gpui::test] async fn my_async_test(cx: &mut TestAppContext)
  • 带迭代次数的属性测试:#[gpui::test(iterations = 10)] fn my_property_test(cx: &mut TestAppContext, mut rng: StdRng),可使用随机数据进行属性测试。

使用方式

资料给出的规则是:如果测试不需要窗口或渲染,可以避免使用 #[gpui::test] 和 TestAppContext,直接编写简单的 Rust 测试。

TestAppContext 的典型用法包括:

#[gpui::test]
fn test_entity_operations(cx: &mut TestAppContext) {
    // Create entities
    let entity = cx.new(|cx| MyComponent::new(cx));

    // Update entities
    entity.update(cx, |component, cx| {
        component.value = 42;
        cx.notify();
    });

    // Read entities
    let value = entity.read_with(cx, |component, _| component.value);
    assert_eq!(value, 42);
}

VisualTestContext 的典型用法包括:

#[gpui::test]
fn test_with_window(cx: &mut TestAppContext) {
    // Create window with component
    let window = cx.update(|cx| {
        cx.open_window(Default::default(), |_, cx| {
            cx.new(|cx| MyComponent::new(cx))
        }).unwrap()
    });

    // Convert to visual context
    let mut cx = VisualTestContext::from_window(window.into(), cx);

    // Access window and component
    let component = window.root(&mut cx).unwrap();
}

适用场景

  • 测试 GPUI 组件与 UI 行为。
  • 测试异步操作与复杂异步场景。
  • 测试分布式系统。
  • 需要确定性执行的测试。
  • 需要窗口或渲染的测试使用 VisualTestContext;不需要窗口或渲染的测试可直接使用简单 Rust 测试。

限制与补充

资料提到更多详细测试模式与示例见 reference.md,其中包含“Testing Crash-Free State Management (Re-entrancy)”,用于在实体重入 panic(cannot update … while it is already being updated)到达用户之前捕获这类问题。最佳实践与运行测试的方法见 examples.md。关于具体安装命令、收费、价格、平台支持等信息,资料暂未提供。