单元测试 | 青训营笔记

98 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

单元测试的规则

  1. 所有测试文件以_test.go结尾
  2. func TestXxx(*testing.T)
  3. 初始化逻辑放到TestMain中

单元测试示例

func Unity() string {
    return "Alice"
}
func TestUnity(t *testing.T) {
    output := Unity()
    expectOutput := "Bob"
    if output != expectOutput {
        t.Errorf("Expected %s do not match actual %s", expectOutput, output)
    }
}

image.png

assert

assert断言是一个能方便编写测试代码的全局函数。所有断言函数都将测试框架提供的*testing.T对象作为第一个参数。这允许断言函数将失败和其他详细信息写入正确的位置。 每个断言函数还将可选的字符串消息作为最终参数,允许将自定义错误消息附加到断言方法输出的消息中。

package unity

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

func TestUnity(t *testing.T) {
	output := Unity()
	expectOutput := "Alice"
	assert.Equal(t, expectOutput, output)
}

image.png

覆盖率

语句的覆盖率是指在测试中至少被运行一次的代码占总代码数的比例。

单元测试中的覆盖率 为了保证代码的质量,我们需要去写单元测试。这里有两个指标,

  1. 函数覆盖率:函数调用个数/函数个数,通常要求100%
  2. 行覆盖率:走到的行的个数/总函数,通常要求>60%

单元测试的覆盖率是衡量代码是否经过足够测试的一项指标

mock

Mock是单元测试中常见的一种技术,就是在测试过程中,对于一些不容易构造或者获取的对象,创建一个Mock对象来模拟对象的行为,从而把测试与测试边界以外的对象隔离开。

简单来说,在单元测试时,流程中可能会有第三方的依赖,这时需要的部分信息在另一个微服务中,这时就可以使用mock来提前模拟出数据,这样当前测试的内容就可以正常运行。