Go工程实践——测试 | 青训营笔记

130 阅读3分钟

测试的分类

  • 从细微到整体可以分为:单元测试、集成测试、回归测试
  • 从覆盖率从大到小可以分为:单元测试、集成测试、回归测试

里面的工作到底是做什么的,下面一一讲解:

  1. 单元测试:开发人员在开发阶段对自己写的函数、接口、模块等做测试
  2. 集成测试:对系统功能维度做测试验证
  3. 回归测试:QA人员手动通过终端回归一些固定的主流程场景

单元测试

测试覆盖率

  • 定义:测试所运行代码的语句占所写的代码语句的百分比,尽量让覆盖率达到80%,这样才能说明我们的测试代码质量更高
  • 小tips
    • 测试粒度足够小,函数单一负责
    • 测试分支相互独立,全面覆盖
func IfNumber(num int) int {
    return 10
}

func main() {
    t := IfNumber(10)
    if t < 10 {
        println("None") //这个不执行
    }
    else {
        println("OK")
    }
}

代码覆盖率100%,如果num = 1,则代码覆盖率66.7%

依赖

在单元测试中,会对文件数据库、还有缓存有一定的依赖。依赖会影响测试的稳定性幂等因此我们在测试中要摆脱这种依赖,需要用到Mock测试。

幂等指的是每次执行都能得到一致的结果

稳定是测试不受环境

例子:当我们测试读取文件相关的模块时,如果文件被删除或者修改,会影响测试的幂等、稳定。

Mock测试

  • 定义:Mock对象可以模拟依赖组件的行为,使得测试更加独立和可控。
  • 使用Mock测试的好处包括:
  1. 隔离依赖:通过使用Mock对象,我们可以隔离被测试对象与其依赖组件之间的耦合,确保测试的独立性。
  2. 提高测试效率:有些依赖组件可能需要耗费较长的时间或资源才能初始化或执行,使用Mock对象可以避免这些开销,提高测试效率。
  3. 模拟异常情况:通过设置Mock对象的行为,我们可以模拟一些异常情况,以验证被测试对象的错误处理能力。

Mock打桩

详细说明可以看看这篇文章 干货!用大白话告诉你什么是Mock测试

在使用 mock 进行接口测试时,一般要做两件事情,即打桩调桩

其实打桩就是创建mock 桩,指定 API 请求内容及其映射的 mock 响应内容;所谓调桩就是被测服务来请求 mock 桩并接收 mock 响应。

Monkey是一个开源的mock测试库,它可以重写可执行的函数,并且替代原来的函数,一般的写法是monkey.Patch(<target function>, <replacement function>),推荐在测试环境中使用,不然会不安全。

下面举一个例子,首先需要import相关的包进来

    package main

    import (
    	"fmt"
    	"os"
    	"strings"

    	"bou.ke/monkey"
    )

接着编写函数或者方法

func main() {
	monkey.Patch(fmt.Println, func(a ...interface{}) (n int, err error) {
		s := make([]interface{}, len(a))
		for i, v := range a {
			s[i] = strings.Replace(fmt.Sprint(v), "hell", "*bleep*", -1)
		}
		return fmt.Fprintln(os.Stdout, s...)
	})
	fmt.Println("what the hell?") // what the *bleep*?
}

基准测试

基准测试是一种用于评估系统性能的测试方法。通过基准测试,我们可以测量系统在特定负载下的响应时间、吞吐量、资源利用率等指标,从而找到系统的瓶颈和优化空间。

写法

func BenchmarkXxx(*testing.B)