跳转至

13 · 测试

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

import (
    "github.com/qianniancn/flowui/theme"
    "github.com/qianniancn/flowui/uitest"
)

应用运行时不要依赖 uitest。

两种 Harness

类型 用途
uitest.Harness 组件/帧级:布局、指针、键盘、样式
uitest.AppHarness 应用级:消息队列、Update、Cmd、错误、关闭取消

Harness.Frame 与真窗口同一套顺序:主布局 → root overlay → focus → cleanup。

Harness 必须显式传入非 nil 的主题;组件从 token 构建自己的默认外观,不再要求额外的视觉实现。

组件测试(Harness)

func TestButtonClick(t *testing.T) {
    h := uitest.New(image.Pt(400, 300), theme.Light())
    // 或 NewWithConfig(uitest.Config{Size: ..., Theme: &activeTheme, Language: ...})

    clicked := false
    root := button.New("OK").OnClick(func() {
        clicked = true
    })

    // 布局一帧、注入指针事件、再帧……
    // 具体 Frame / 指针 API 见 uitest 包 go doc 与 harness_test.go
    _ = h
    _ = root
    _ = clicked
}

常用能力(名称以源码为准):

  • 固定尺寸视口与 metric
  • 可控时钟(动画可测)
  • 指针/键盘事件注入
  • 读取布局结果或交互状态

参考:

  • uitest/harness_test.go
  • 各 widget/*/…_test.go
  • ui/*_test.go、ui/api_external_test.go

应用测试(AppHarness)

验证:

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

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

测试建议

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

示例里的测试

仓库 uitest/harness_test.go 和 uitest/app_test.go 展示组件与应用测试; 默认外观和状态的测试位于相应的 widget 组件目录。

下一步