测试是编程工作中非常重要的一环,但很多人却忽视了这一点,又或者只是把测试看作是一种可有可无的补充手段。Go 语言提供了一些基本的测试功能,这些功能初看上去可能会显得非常原始。

1,  Go 与测试

       最主要的是testing 包。

       net/http/httptest 包是另一个与Web 应用编程有关的库,这个库是基于testing 库实现的。

       testing 包需要与go test 命令以及源代码中所有以t est . go 后缀结尾的测试文件一同使用。非强制要求

 eg: 源码文件server.go ,我们可以创建出一个名为server_test.go 的测试文件, 需要注意的一点是,被测试的源码文件和测试文件必须位于同一个包之内

测试文件中创建具有以下格式的测试函数,其中Xxx 可以是任意英文字母以及数字的组合,但是首字符必须是大写的英文字母:

func TestXxx(*testing. T) { . . . }

测试函数的内部,用户可以使用Error 、Fail 等一系列方法表示测试失败。

2, 使用创造行单元测试

       单元测试( unit test ),就是一种为验证单元的正确性而设置的自动化测试, 一个单元就是程序中的一个模块化部分。一般来说, 一个单元通常会与程序中的一个函数或者一个方法相对应,但这并不是必须的。程序中的一个部分能否独立地进行测试,是评判这个部分能否被归纳为“单元”的一个重要指标。一个单元通常会接受数据作为输入并返回相应的输出,而单元测试用例要做的就是向单元传人数据,然后检查单元产生的输出是否符合预期。单元测试通常会以测试套件( test suite )的形式运行,后者是为了验证特定行为而创建的单元测试用例集合。

可以使用具体( verbose )标志
-v 来获得更详细的信息,并通过覆盖率标志- c over 来获知测试用例对代码的覆盖率:

在名为unit_testing 的目录中执行

go test -v - cover

testing .T 结构拥有几个非常有用的函数:

• Log  将给定的文本记录到错误日志里面,与fmt.Println 类似;

• Logf 根据给定的格式,将给定的文本记录到错误日志里面,与frnt.Printf 类似;
• Fail 将测试函数标记为“已失败”,但允许测试函数继续执行;
• FailNow  测试函数标记为已失败”并停止执行测试函数。

还提供了一些便利函数,而它们是由上面四个组合成的

例如:Error 函数是Log函数和Fail 函数的组合函数,它在被调用肘,会先调用Log 函数,然后再调用Fail 函数

便利函数

 

Log

Logf

Fail

Error

Errorf

FailNow

Fatal

Fatalf

2.1 跳过测试用例

go test 命令传入短暂标志- short

// Long running test case
func TestLongRunningTest(t *testing.T) {
  if testing.Short() {
    t.Skip("Skipping long running test in short mode")
  }
  time.Sleep(10 * time.Second)
}

测试加-short  TestLongRunningTest 将被跳过,反之则被执行

$ go test -v -short

 

2.2 以并行方式运行测试

程序在每个测试用例的开头调用了testing.T 结构的Parallel 函数

$ go test -v  -parallel 3

并行标志- parallel 用于指示Go 以并行方式运行测试用例,而参数3 则表示我们希望最多并行运行3 个测试用例。

 

2.3 基准测试

Go 的testing 包支持两种类型的测试,

1) 一种是用于检验程序功能性的功能测试( functional testing )

2)  是用于查明任务单元性能的基准测试(benchmarking)

也需要放置到以_test.go 为后缀的文件中

func BenchmarkXxx(*testing.B) { . . . }

func BenchmarkDecode(b *testing.B) {
  for i := 0; i < b.N; i++ {
    decode("post.json") 
  }
}
$ go test -run x -bench .
- run 标志用于指定需要被执行的功能测试用例
ns/op   每次迭代消耗的ns 时间
-benchmem
 test a memory consumption and an allocations count. It’ll look like:
 bytes per operation and allocations per operation. Pretty useful information
PASS
BenchmarkSample 10000000               208 ns/op              32 B/op          2 allocs/op