跳转至

13 · 测试

FlowUI 提供 uitest 包:不打开真窗口也能测控件与 MVU。

import "github.com/qianniancn/flowui/uitest"

应用运行时不要依赖 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.goui/api_external_test.go

应用测试(AppHarness)

验证:

  • sendUpdate
  • Cmd 执行与回传消息
  • 错误是否到达 handler
  • 关闭时 Cmd/订阅取消

适合测「加载成功/失败写回 Model」而不起窗口。见 uitest/app_test.go

测试建议

  1. Update 纯逻辑可直接单测,不必上 Harness。
  2. 交互与样式用 Harness,避免 flaky 的截图依赖(除非你自建截图流程)。
  3. Key 写死在测试里,保证状态可重复。
  4. 动画测试推进 harness 时钟,而不是 time.Sleep
  5. 外部 IO 在 Cmd 边界用假实现注入。

示例里的测试

部分示例带 _test.go(如 examples/selectsexamples/animations),展示「示例即可测」的写法。

下一步