清风徐来
Michael's Blog
Go的单元测试

测试在所有软件中都非常重要。 请输入图片描述 能够确保代码的正确性并确保您所做的任何更改最终都不会破坏代码库中任何其他部分的内容,这非常重要。

##目标

在本教程结束时,您将掌握使用标准testing包,测试Go中的基本函数和方法。

在本教程中,我们将介绍如何使用go test命令为您的go代码开发和运行测试。

##Go的测试文件

如果您之前看过一些go项目,您可能已经注意到大多数(如果不是全部)的项目,Go代码文件都在同一目录中具有FILE_test.go对应项。

这些文件包含项目的所有单元测试,测试其对应的所有代码

简单的项目机构

myproject/
- calc.go
- calc_test.go
- main.go
- main_test.go

##一个简单的测试文件

假如我们有一个非常简单的go程序,它由一个文件组成,并具有calculate()函数。这个calculate()函数只需要1个参数,返回加2后的结果。让我们开始运行 main.go

package main

import (
    "fmt"
)

// 计算 returns x + 2.
func Calculate(x int) (result int) {
    result = x + 2
    return result
}

func main() {
    fmt.Println("Hello World")
}

如果想要进行测试,我们可以在同一目录中创建一个main_test.go文件并编写以下测试: main_test.go

package main

import (
    "testing"
)

func TestCalculate(t *testing.T) {
    if Calculate(2) != 4 {
        t.Error("期望 2 + 2 应该等于 4")
    }
}

##运行测试

$ go test
PASS
ok      github.com/kissjava/helloworld  0.005s

##Table Drive Testing

我们可以用array进行一系列的测试:

func TestTableCalculate(t *testing.T) {
    var tests = []struct {
        input    int
        expected int
    }{
        {2, 4},
        {-1, 1},
        {0, 2},
        {-5, -3},
        {99999, 100001},
    }

    for _, test := range tests {
        if output := Calculate(test.input); output != test.expected {
            t.Errorf("Test Failed: 输入%d, 期望%d, 实际收到: %d", test.input, test.expected, output)
        }
    }
}

##详细(Verbose)的测试输出 $ go test -v demo:

$ go test -v
=== RUN   TestCalculate
--- PASS: TestCalculate (0.00s)
=== RUN   TestTableCalculate
--- PASS: TestTableCalculate (0.00s)
PASS
ok      github.com/kissjava/helloworld  0.005s

##检查测试覆盖率

go test -cover
PASS
coverage: 66.7% of statements
ok      github.com/kissjava/helloworld  0.005s

以上我们的测试覆盖率是66.7%。还好吧,但是,哪些没有测试,哪些已经测试来,这里是没法体现的。

##可视化的测试覆盖率 先运行$ go test -coverprofile=coverage.out生产测试文件 再运行$ go tool cover -html=coverage.out直接浏览器打开可视化结果。 以上以html的格式输出测试覆盖率,那些没有测试到的可以看到。 20190730185641.jpg 绿色部分是测试覆盖到的,红色部分是未测试的。


最后修改于 2019-07-30