Skip to content
On this page

单元测试

测试图形程序

好的测试套件的一部分是能够快速编写测试并正确的运行。Fyne的API设计出来就是为了轻松测试。通过将组件逻辑和渲染分离开,我们可以加载程序的时候并不实际显示他们,并不用完全测试其功能。

案例

我们可以通过扩展Hello World程序来演示单元测试

go
func makeUI() (*widget.Label, *widget.Entry) {
	return widget.NewLabel("Hello world!"),
		widget.NewEntry()
}

func main() {
	a := app.New()
	w := a.NewWindow("Hello Person")

	w.SetContent(container.NewVBox(makeUI()))
	w.ShowAndRun()
}

为了测试这种输入行为,我们创建了一个新文件(名称以_test.go结尾,将其标记为测试),该文件定义了一个TestGreeter函数。

go
 package main

import (
	"testing"
)

func TestGreeting(t *testing.T) {
}

我们可以添加一个初始测试来验证初始状态,为此,我们测试从makeUI返回的Label的Text字段,如果测试不正确,则返回错误。将以下代码添加到测试方法中:

go
out, in := makeUI()

	if out.Text != "Hello world!" {
		t.Error("Incorrect initial greeting")
	}

你可以使用go测试运行所有这些测试。-就像其他测试一样。这样做你现在会看到一个失败——因为我们没有添加迎宾逻辑。将makeUI函数更新为以下代码:

go
func makeUI() (*widget.Label, *widget.Entry) {
	out := widget.NewLabel("Hello world!")
	in := widget.NewEntry()

	in.OnChanged = func(content string) {
		out.SetText("Hello " + content + "!")
	}
	return out, in
}

这样做,您将看到测试现在通过了。您还可以运行完整的应用程序(使用go run),并在Entry字段中输入名称时看到问候语更新。还请注意,这些测试都在不显示窗口或窃取鼠标的情况下运行-这是Fyne单元测试设置的另一个好处。