Go语言工程实践之测试笔记 | 青训营

110 阅读5分钟

一、测试

  • 回归测试
  • 集成测试
  • 单元测试

覆盖率依次变大,成本依次降低。

1.回归测试

回归测试是指修改旧代码后,重新测试以确认没有引入新的错误或导致其他代码产生错误。

回归测试主要应用在代码变更的场景,我们需要测试修改后的代码是否影响软件应用程序的其他功能。
同时,当将新功能添加到软件应用程序中并用于缺陷修复和性能问题修复时,同样需要进行回归测试。

2.集成测试

集成测试主要测试软件模块之间的交互和协作,验证多个模块或组件在一起协同工作时的正确性。

集成测试有助于验证产品的收集和接口模块。
在软件开发过程中,通常会将软件系统划分为多个模块或组件,每个模块负责实现不同的功能。在集成测试中,这些模块会被组合在一起,并进行全面的测试,以验证它们之间的协作和接口是否正确。

3.单元测试

单元测试是指开发者在开发阶段对单独的模块进行功能测试。单元测试检查应用程序中的一小段代码是否在做它应该做的事情。在单元测试中,一次只测试一个模块,因此测试人员的重点也是在应用程序的内部设计上。

单元测试是作为测试的第一阶段进行的,一般由应用程序的开发人员进行。单元测试中不支持并行测试,因为在单元测试中一次只测试一个模块。

由于一次只测试一个模块,所以缺陷很容易被识别,并被锁定为每个模块。单元测试一般不依赖于项目的大小,所以它可以在小型和大型的项目中进行。

二、Golang单元测试基本使用

1.Go单元测试的基本规范:

测试文件以_test.go结尾

每个测试函数都必须导入testing包,测试函数的命名类似于: func TestName(t *teating.T),其中传入参数必须是*testing.T。测试函数函数名必须以大写开头Test后面紧跟大写字母开头的命名或下划线+命名,例如:

  • func TestName(t *testing.T) 可以
  • func Test_name(t *testing.T) 可以
  • func Testname(t *testing.T) 不可以

通常情况下,需要将测试文件和源代码放在同一个包内。一般测试文件的命名,都是 {src_filename}_test.go,比如我们的源代码文件是hello.go ,那么就会在 hello.go 的相同目录下,再建立一个 hello_test.go 的单元测试文件去测试 hello.go 文件里的相关方法。

当运行go test命令时,会遍历所有的符合上述命名的测试函数,然后生成一个临时的main包来调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。

func TestMain(m *testing.M){
    //测试前:数据装载、配置初始化等前置工作
    code := m.Run()  //运行package下所有单测
    //测试后:释放资源等收尾工作
    os.Exit(code) //退出
}

2.单元测试运行

go test [flags] [packages]命令运行

image.png

go test -v执行单测并打印详情

运行方法:进入到包内运行命令go test -v
参数 -v 可以打印详情,也可以只运行某个方法的单元测试:go test -v-run="xxx",支持正则表达式。

go test -v -cover 执行单测并计算覆盖率

该方法可以计算单元测试的覆盖率:go test -v -cover

覆盖率是单元测试的主要评估标准,代码覆盖率越高证明越多的代码通过了测试。

例如下列代码:

func JudgePassLine(score int16) bool{
    if score>=60{
        return ture
    }
    return false

在运行命令go test judgement_test.go judgement.go --cover之后得到覆盖率为66.7%,由于执行代码时只有两行执行了,得出覆盖率为2/366.7%

3.依赖

在实际项目单元测试中,真实的依赖关系是一个需要特别考虑的问题。真实的依赖关系是指被测试单元所依赖的外部组件、服务或对象,它们可能难以在测试环境中进行模拟或替代。 由于存在一些依赖,直接进行单元测试是不稳定的。因此需要用Mock测试。

Mock 测试是一种软件测试技术,它可以模拟外部依赖组件的行为和状态,以便进行独立、稳定和快速的测试。在实际软件开发中,我们常常需要依赖其他组件或服务来完成某些业务逻辑,例如数据库、网络连接、消息队列等等。这些外部依赖可能存在各种问题,例如不稳定、缺乏数据、难以模拟等等,从而影响我们对代码逻辑的测试、调试和优化。

Mock 测试可以解决这些问题,它通过构造和配置 Mock 对象来模拟外部依赖的行为和状态,从而使得测试变得独立、稳定和准确。Mock 测试的目的是隔离被测代码和外部依赖,消除随机性和不可控性,提高测试覆盖和质量,加速软件开发和迭代。