最近在加深对GO语言基础知识学习,巩固下基础,同时分享给朋友们
go中单元测试
通过 go test 进行测试
go 中给我们提供一个包:testing,Go 为我们提供一些很好的功能,我们可以在不需要太多学习的情况下使用它们。
若要在 Go 中开始使用测试,首先需要定义要测试的包。如果还没有,请创建一个名为 testing101 的包,并创建文件 sum.go,添加上下面的代码:
package testing101 func Sum(numbers []int) int { sum := 0 for _, n := range numbers { sum += n } return sum }
接下来在同一个包中,创建一个名为 sum_test.go 的文件,并将下面的代码添加到其中。
package testing101 import ( "fmt" "testing" ) func TestSum(t *testing.T) { numbers := []int{1, 2, 3, 4, 5} expected := 15 actual := Sum(numbers) if actual != expected { t.Errorf("Expected the sum of %v to be %d but instead got %d!", numbers, expected, actual) } }
现在我们要运行我们的测试,所以在终端中切换到 testing101 包所在目录,并使用下面的命令运行测试。
go test -v
你应该看到像这样的输出:
=== RUN TestSum
— PASS: TestSum (0.00s)
PASS
ok calhoun.io/testing101 0.005s
恭喜!您刚刚使用 Go 内置的 testing 编写了第一个测试。现在,让我们深入了解实际发生的事情。
首先,是我们的文件名。Go 要求所有的测试都在以 _test.go 结尾的文件中。这使得我们在检查另一个 package 包的源代码时,确定哪些文件是测试和哪些文件实现功能非常容易。
在看了文件名之后,我们可以直接跳转到代码中,将测试包导入。它为我们提供了一些类型 (如testing.T) ,这些类型提供常见功能,比如在测试失败时设置错误消息。
接下来,是函数 TestSum()。所有的测试都应该以 func TestXxx(*testing.T)
的格式来编写。其中 Xxx 可以是任何字符或数字,而第一个字符需要是大写字符或数字。(译注:一般,Xxx 就是被测试的函数名)
最后,如上所述,我们使用了 TestSum
函数中的参数 *tesing.T
。如果我们没有得到预期的结果,我们使用它来设置一个错误,当我们运行测试时,该错误将显示在终端上。若要查看此操作,请将测试代码中的 expected 更新为 18,而不更新 numbers 变量,然后使用 go test -v 运行测试。您应该会看到显示如下所示错误信息的输出:
=== RUN TestSum
— FAIL: TestSum (0.00s)
sum_test.go:14: Expected the sum of [1 2 3 4 5] to be 18 but instead got 15!
FAIL
exit status 1
FAIL calhoun.io/testing101 0.005s