Go 测试| 青训营笔记

125 阅读3分钟

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

前言

测试关系到系统质量,质量则决定系统的稳定性。本章主要对单元测试、Mock测试、基准测试进行学习。

单元测试

测试

测试是一种技术,用来评估软件或硬件功能,性能和可靠性的一种行为。它也可以用来证明产品是否满足特定的功能要求或定义的质量标准。在专业开发中,测试通常包括手工测试、单元测试、集成测试、系统测试和验收测试。

回归测试-》集成测试-》单元测试从上到下,覆盖率逐渐变大,成本逐渐变低。

单元测试

image.png 单元测试是指对软件中的最小可测试单元进行检查和验证的测试过程。 单元测试的目的是确保各种软件单元在组装到完整程序之前,都能正常工作。 这便是所谓“从小处开始”(bottom-up),以此来减少重大错误在软件开发周期中出现。

单元测试-规则

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

单元测试-覆盖率

  • 衡量代码是否经过了足够的测试
  • 评价项目的测试水准
  • 评估项目是否达到了高水准测试等级 代码示例:
func JudgePassLine(score int16) bool {
    if score >= 60 {
        return true
    }
    else {
        return false
    }
}
​
func TestJudgePassLineTrue(t *testing.T) {
    isPass := JudgeePassLine(70)
    assert.Equal(t, true, isPass)
}
​
func TestJudgePassLineFalse(t *testing.T) {
    isPass := JudgeePassLine(50)
    assert.Equal(t, false, isPass)
}
​
 go test judgment_test.go judgment.go --cover

般覆盖率:50%~60%,较高覆盖率80%+。 测试分支相互独立、全面覆盖。 测试单元粒度足够小,函数单一职责。

单元测试-依赖

image.png 单元测试依赖于程序代码中定义的对象、接口、类、方法以及一些特定的外部依赖(比如数据库)。这些依赖的关系决定单元测试所要做的内容,当这些依赖发生变化时,单元测试也会相应地做出相应地改变。

单元测试-文件处理

func ReadFirstLine() string {
    open, err := os.Open("log")
    defer open.Close()
    if err != nil {
        return ""
    }
    scanner := bufio.NewScanner(open) 
    for scanner.Scan() {
        return scanner.Text()
    }
    return ""
}
​
func ProcessFirstLine() string {
    line := ReadFirstLine()
    destLine := strings.ReplaceAll(line, "11", "00")
    return destLine
}
​
func TestProcessFirstLine(t *testing.T) {
    firstLine := ProcessFirstLine()
    assert.Equal(t, "line00", firstLine)
}

单元测试-Mock

Monkey是一个开源的mock测试库,可以对method, 或者实例的方法进行mock,反射,指针赋值 Mockey Patch 的作用域在 Runtime,在运行时通过通过 Go 的unsafe 包,能够将内存中函数的地址替换为运行时函数的地址。将待打桩函数或方法的实现跳转到。

func Patch(target, replacement interface{}) *PatchGuard {
    t := reflect.ValueOf(target)
    r := reflect.ValueOf(replacement)
    patchValue(t, r)
    return &PatchGuard{t, r}
}
​
func Unpatch(target interface{}) bool {
    return unpatchValue(reflect.ValueOf(target))
}
​
func TestProcessFirstLineWithMock(t *testing.T) {
    monkey.Patch(ReadFirstLine, func() string {
        return "line110"
    })
    defer monkey.Unpatch(ReadFirstLine)
    line := ProcessFirstLine()
    assert.Equal(t, "line000", line)
}

基准测试

基准测试(Benchmark Testing)是一种独立测试,它专门以改善系统性能为目标。这种测试往往由技术团队或者受训的小组进行,使用十分严格的技术和标准。例如,当新版软件产品宣传需要改进性能时,需要使用此类测试来衡量软件改进后的实际性能。

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力

总结

通过这次学习对go单元测试的相关内容有了新的认识,也对go语言单元尝试规范、测试mock以及基础测试进行了实验。