编写简单的单元测试
单元测试是一种测试函数和方法等小段代码的方法。 它的用途在于让您及早发现错误。 单元测试会让您的测试策略更高效,因为它们小且独立,易于维护。
我们来创建一个示例,练习一下测试。 创建函数 Fooer,它将 int 作为输入并返回 string。 如果输入的整数能被三整除,则返回 "Foo",否则,将数字作为 string 返回。
创建一个名为 fooer.go 的新文件,粘贴以下代码来创建示例:
package main
import "strconv"
// If the number is divisible by 3, write "Foo" otherwise, the number
func Fooer(input int) string {
isfoo := (input % 3) == 0
if isfoo {
return "Foo"
}
return strconv.Itoa(input)
}
Go 中的单元测试与被测函数位于同一个软件包(即同一个文件夹)中。 按照惯例,如果函数在文件 fooer.go 中,那么该函数的单元测试则在文件 fooer_test.go 中。
编写一个简单的函数来测试 Fooer 函数,后者会在您输入 3 时返回 "Foo":
package main
import "testing"
func TestFooer(t *testing.T) {
result := Fooer(3)
if result != "Foo" {
t.Errorf("Result was incorrect, got: %s, want: %s.", result, "Foo")
}
}
Go 中的测试函数以 Test 开头,并将 *testing.T 作为唯一形参。 在大多数情况下,单元测试会被命名为 Test[NameOfFunction]。 testing 软件包提供了与测试工作流交互的工具,例如 t.Errorf,它会通过在控制台上显示错误消息来指示测试失败。
您可以通过命令行运行测试:
go test
输出应如下所示:
在 GoLand 中,您可以点击间距中的绿色箭头运行特定测试。
完成测试运行后,GoLand 会在 Run(运行)工具窗口中显示结果。 右侧控制台显示了当前测试会话的输出。 它会显示测试执行的详细信息以及测试失败或被忽略的原因。
run_fooer
要运行软件包中的所有测试,请点击顶部的绿色双三角形图标。
run-all-tests
编写表驱动测试
编写测试时,您可能会为了覆盖所有用例而重复大量代码。 想一想您将如何覆盖 Fooer 示例中涉及的许多用例。 您可以为每种用例都编写一个测试函数,但这会导致大量重复。 您也可以在同一个测试函数中多次调用被测函数并逐次验证输出,但如果测试失败,则很难确定失败点。 最后,您还可以使用表驱动方式帮助减少重复。 顾名思义,这涉及将测试用例组织为包含输入和所需输出的表。
这有两个好处:
- 表测试重用相同的断言逻辑,使测试保持整洁。
- 表测试可以清晰显示选择的输入和测试涵盖的内容。 此外,每一行都可以获得一个唯一名称,帮助识别正在测试的内容和表达测试的意图。