用途
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。关于具体安装命令、收费、价格、平台支持等信息,资料暂未提供。