smallfish bio photo

smallfish

Engineer at Alibaba, Taobao.com #golang #clojure #nginx-lua #postgres

Email Twitter Github

Go 很多地方都透露着“约定大于配置”的理论,比如测试、可见性、语法等等。

本文示例模块为:foo.go,则对应的测试模块为:foo_test.go,测试版本为:go v1.0.3。

先写好示例代码: foo.go

package foo

func Add(a, b int) int {
    return a + b
}

对应的测试代码:foo_test.go

package foo

import "testing"

func TestAdd(t *testing.T) {
    if (Add(1, 2) != 3) {
        t.Error("test foo:Addr failed")
    } else {
        t.Log("test foo:Addr pass")
    }
}

到这里可以运行测试了:

$ go test
PASS
ok      _/Users/smallfish/test/go/foo   0.080s

或者详细一点的输出:

$ go test -v
=== RUN TestAdd
--- PASS: TestAdd (0.00 seconds)
foo_test.go:9:  test foo:Addr pass
                PASS
ok      _/Users/smallfish/test/go/foo   0.013s

默认测试函数是以“Test”开头,比如:TestXXX。而性能测试代码是以“Benchmark”开头。

下面来简单一段性能测试代码:

func BenchmarkAdd(b *testing.B) {
    // 如果需要初始化,比较耗时的操作可以这样:
    // b.StopTimer()
    // .... 一堆操作
    // b.StartTimer()
    for i := 0; i < b.N; i++ {
        Add(1, 2)
    }
}

跑一下性能测试:

$ go test -test.bench=".*"
PASS
BenchmarkAdd    2000000000               1.27 ns/op
ok      _/Users/smallfish/test/go/foo   2.702s

更多请参考:“go help test” 命令和 testing 模块

END