Go语言学习11-测试

单元测试

1
2
3
4
5
6
// functions.go
package testing

func square(op int) int {
return op * op
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// functions_test.go
package testing

import (
"fmt"
"github.com/stretchr/testify/assert"
"testing"
)

func TestSquare(t *testing.T) {
inputs := [...]int{1, 2, 3}
expected := [...]int{1, 4, 9}
for i := 0; i < len(inputs); i++ {
ret := square(inputs[i])
assert.Equal(t, expected[i], ret)
//if ret != expected[i] {
// t.Errorf("input is %d, the expcted is %d, the actual %d",
// inputs[i], expected[i], ret)
//}
}
}

func TestErrorInCode(t *testing.T) {
fmt.Println("Start")
t.Error("Error")
fmt.Println("End")
}

func TestFailInCode(t *testing.T) {
fmt.Println("Start")
t.Fatal("Error")
fmt.Println("End")
}

内置单元测试框架

  • Fail, Error: 该测试失败, 该测试继续, 其他测试继续执行
  • FailNow, Fatal: 该测试失败, 该测试中止, 其他测试继续执行

  • 代码覆盖率

    1
    go test -v -cover
  • 断言https://github.com/stretchr/testify

Benchmark

1
2
3
4
5
6
7
8
9
func BenchmarkConcatStringByAdd(b *testing.B) {
// 与性能测试无关的代码
b.ResetTimer()
for i := 0; i < b.N; i++ {
// 测试代码
}
b.StopTimer()
// 与性能测试无关的代码
}

benchmark命令

1
go test -bench=. -benchmem

-bench=\<相关benchmark测试>

Windows下使用go test命令行时, -bench=. 应写为 -bench="."

Behavior Driven Development

让业务领域的专家参与开发

“I believe that the hardest part of software projects, the most common source of project failure, is communication with the customers and users of that software. By providing a clear yet precise language to deal with domains, a DSL can help improve this communication.” – Martin Fowler.

用业务领域的语言来描述

BDD in Go

项目网站

https://github.com/smartystreets/goconvey

安装
1
go get -u github.com/smartystreets/goconvey/convey
启动 web ui
1
$GOPATH/bin/goconvey
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func TestSpec(t *testing.T) {
// Only pass t into top-level Convey calls
Convey("Given 2 even numbers", t, func() {
a := 2
b := 4

Convey("When add the two numbers", func() {
c := a + b

Convey("Then the result is still even", func() {
So(c%2, ShouldEqual, 0)
})
})
})
}