Go语言精进之路:从新手到高手的编程思想、方法和技巧(2)
上QQ阅读APP看书,第一时间看更新

41.1 经典模式——平铺

Go从对外发布的那一天起就包含了go test命令,这个命令会执行_test.go中符合TestXxx命名规则的函数进而实现测试代码的执行。go test并没有对测试代码的组织提出任何约束条件。于是早期的测试代码采用了十分简单直接的组织方式——平铺

下面是对Go 1.5版本标准库strings包执行测试后的结果:

# go test -v .
=== RUN   TestCompare
--- PASS: TestCompare (0.00s)
=== RUN   TestCompareIdenticalString
--- PASS: TestCompareIdenticalString (0.00s)
=== RUN   TestCompareStrings
--- PASS: TestCompareStrings (0.00s)
=== RUN   TestReader
--- PASS: TestReader (0.00s)
...
=== RUN   TestEqualFold
--- PASS: TestEqualFold (0.00s)
=== RUN   TestCount
--- PASS: TestCount (0.00s)
...
PASS
ok    strings     0.457s

我们看到,以strings包的Compare函数为例,与之对应的测试函数有三个:TestCompare、TestCompareIdenticalString和TestCompareStrings。这些测试函数各自独立,测试函数之间没有层级关系,所有测试平铺在顶层。测试函数名称既用来区分测试,又用来关联测试。我们通过测试函数名的前缀才会知道,TestCompare、TestCompareIdenticalString和TestCompareStrings三个函数是针对strings包Compare函数的测试。

在go test命令中,我们还可以通过给命令行选项-run提供正则表达式来匹配并选择执行哪些测试函数。还以strings包为例,下面的命令仅执行测试函数名字中包含TestCompare前缀的测试:

# go test -run=TestCompare -v .
=== RUN   TestCompare
--- PASS: TestCompare (0.00s)
=== RUN   TestCompareIdenticalString
--- PASS: TestCompareIdenticalString (0.00s)
=== RUN   TestCompareStrings
--- PASS: TestCompareStrings (0.00s)
PASS
ok    strings     0.088s

平铺模式的测试代码组织方式的优点是显而易见的。

  • 简单:没有额外的抽象,上手容易。
  • 独立:每个测试函数都是独立的,互不关联,避免相互干扰。