13 · 测试¶
FlowUI 提供 uitest 包:不打开真窗口也能测控件与 MVU。
应用运行时不要依赖 uitest。
两种 Harness¶
| 类型 | 用途 |
|---|---|
uitest.Harness |
组件/帧级:布局、指针、键盘、样式 |
uitest.AppHarness |
应用级:消息队列、Update、Cmd、错误、关闭取消 |
Harness.Frame 与真窗口同一套顺序:主布局 → root overlay → focus → cleanup。
组件测试(Harness)¶
func TestButtonClick(t *testing.T) {
h := uitest.New(image.Pt(400, 300))
// 或 NewWithConfig(uitest.Config{Size: ..., Theme: ..., Language: ...})
clicked := false
root := ui.Button("ok", ui.Text("OK")).OnClick(func() {
clicked = true
})
// 布局一帧、注入指针事件、再帧……
// 具体 Frame / 指针 API 见 uitest 包 go doc 与 harness_test.go
_ = h
_ = root
_ = clicked
}
常用能力(名称以源码为准):
- 固定尺寸视口与 metric
- 可控时钟(动画可测)
- 指针/键盘事件注入
- 读取布局结果或交互状态
参考:
uitest/harness_test.go- 各
internal/components/*/…_test.go ui/*_test.go、ui/api_external_test.go
应用测试(AppHarness)¶
验证:
send→Update- Cmd 执行与回传消息
- 错误是否到达 handler
- 关闭时 Cmd/订阅取消
适合测「加载成功/失败写回 Model」而不起窗口。见 uitest/app_test.go。
测试建议¶
- Update 纯逻辑可直接单测,不必上 Harness。
- 交互与样式用 Harness,避免 flaky 的截图依赖(除非你自建截图流程)。
- Key 写死在测试里,保证状态可重复。
- 动画测试推进 harness 时钟,而不是
time.Sleep。 - 外部 IO 在 Cmd 边界用假实现注入。
示例里的测试¶
部分示例带 _test.go(如 examples/selects、examples/animations),展示「示例即可测」的写法。