测试| 青训营;

123 阅读4分钟

go test

go test命令是一个按照一定的约定和组织的测试代码的驱动程序。在包目录内,所有以 _test.go为后缀名的源文件并不是go build构建包的一部分,它们是go test测试的一部分。 在_test.go文件中,有三种类型的函数:测试函数、基准测试函数、示例函数。一个测试函 数是以Test为函数名前缀的函数,用于测试程序的一些逻辑行为是否正确;go test命令会调用 这些测试函数并报告测试结果是PASS或FAIL。基准测试函数是以Benchmark为函数名前缀的 函数,它们用于衡量一些函数的性能;go test命令会多次运行基准函数以计算一个平均的执 行时间。go test命令会遍历所有的_test.go文件中符合上述命名规则的函数,然后生成一个临时的 main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的 临时文件。

随机测试

表格驱动的测试便于构造基于精心挑选的测试数据的测试用例。另一种测试思路是随机测 试,也就是通过构造更广泛的随机输入来测试探索函数的行为。 那么对于一个随机的输入,我们如何能知道希望的输出结果呢?这里有两种处理策略。第一 个是编写另一个对照函数,使用简单和清晰的算法,虽然效率较低但是行为和要测试的函数 是一致的,然后针对相同的随机输入检查两者的输出结果。第二种是生成的随机输入的数据 遵循特定的模式,这样我们就可以知道期望的输出的模式。

测试一个命令

对于测试包 go test 是一个的有用的工具,但是稍加努力我们也可以用它来测试可执行程 序。如果一个包的名字是 main,那么在构建时会生成一个可执行程序,不过main包可以作为 一个包被测试器代码导入。

白盒测试

一种测试分类的方法是基于测试者是否需要了解被测试对象的内部工作原理。黑盒测试只需 要测试包公开的文档和API行为,内部实现对测试代码是透明的。相反,白盒测试有访问包内 部函数和数据结构的权限,因此可以做到一下普通客户端无法实现的测试。例如,一个白盒 测试可以在每个操作之后检测不变量的数据类型。(白盒测试只是一个传统的名称,其实称 为clear box测试会更准确。) 黑盒和白盒这两种测试方法是互补的。黑盒测试一般更健壮,随着软件实现的完善测试代码 很少需要更新。它们可以帮助测试者了解真是客户的需求,也可以帮助发现API设计的一些不 足之处。相反,白盒测试则可以对内部一些棘手的实现提供更多的测试覆盖。

测试函数 每个测试函数必须导入testing包。测试函数有如下的签名

func TestName(t *testing.T) {

// ...

}

测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头: func TestSin(t *testing.T) {

/* ... */

}

func TestCos(t *testing.T) {

/* ... */

}

func TestLog(t *testing.T) {

/* ... */

}

其中t参数用于报告测试失败和附加的日志信息。让我们定义一个实例包gopl.io/ch11/word1, 其中只有一个函数IsPalindrome用于检查一个字符串是否从前向后和从后向前读都是一样的。

在相同的目录下,word_test.go测试文件中包含了TestPalindrome和TestNonPalindrome两个 测试函数。每一个都是测试IsPalindrome是否给出正确的结果,并使用t.Error报告失败信息:

package word 
import "testing" 
func TestPalindrome(t *testing.T) {
if !IsPalindrome("detartrated") { 
t.Error(`IsPalindrome("detartrated") = false`) 
}
if !IsPalindrome("kayak") { 
t.Error(`IsPalindrome("kayak") = false`)
} 
}
func TestNonPalindrome(t *testing.T) {
if IsPalindrome("palindrome") {
t.Error(`IsPalindrome("palindrome") = true`)
}
}