Go语言学习笔记(5)|青训营笔记

76 阅读4分钟

这是我参与「第五届青训营」笔记创作活动的第5天,在昨天的笔记之中主要记录了Go的依赖管理的相关知识,当我们要进行项目开发的时候很多情况下我们需要借助他人已经写好的代码,这样可以节省我们的开发时间,也可以让我们专注于做项目开发,而今天的学习笔记继续补充上次笔记之中的知识点。

一、本堂课的重点内容

今天课程的主要框架为:

  • 语言进阶

    • Go语言的并发编程
  • 依赖管理

    • 背景
    • Go依赖管理演进
    • Go Module实战
  • 测试

    • 单元测试
    • Mock测试
    • 基准测试
  • 项目实战

    • 需求设计

    • 代码开发

    • 测试运行

二、详细知识介绍

    在做项目开发的时候,我们需要进行测试,通过测试来不断完善可以提高软件的质量,也可以用来检查我们所写的代码的情况是怎样,这样有利于降低在正式运行时的BUG出现的频率,对于测试,在今天的课程之中主要讲解了三个方面,分别是单元测试、Mock测试和基准测试,接下来对这三点测试分别进行介绍。

    2.1 测试的分层

    如图所示,测试大致呈现出下面的金字塔结构,最顶层是回归测试,回归测试主要围绕系统功能是否完善,对项目的目标功能进行测试,当遇到BUG的时候返回给开发者当开发者修复BUG后再此进行的测试。然后是集成测试,集成测试主要针对的是每个功能模块开发完毕后将他们集成之后进行统一测试,用于验证每个功能模块是否在集成之后如预期的那样成功执行,紧接着是单元测试,单元测试是针对最小的测试单元进行的验证测试,像函数等。

image.png

    2.2单元测试

    单元测试主要针对的是最小的可测试单元的测试,他的主要思想是,传入需要测试的值,然后通过所传入值的预期结果与实际结果进行对比,如下图所示:

image.png

    针对于上述所讲解的测试思路,下面对Go语言的单元测试进行说明。

        2.2.1规则

        a.所有测试文件的命名方式一般是以_test.go结尾。

        b.对于需要测试那个函数,那么对应的测试函数入口及命名应该是func TestXxx(t *testing.T)

        如果上述规则是正确的话,那么在这个函数的旁边是可以看到一个执行按钮的,例如下图,在第一个图之中写了一个Add.go的源文件,这个源文件之中写了一个Add(a,b)的函数,然后写了一个Add_test.go的源文件,里面写了一个TestAdd函数,这个时候在它的旁边其实就可以看到一个执行按钮。

image.png

image.png

        c.当测试需要进行初始化、测试完后需要进行收尾工作的时候,可以定义一个func TestMain(m *testing.M)函数,这个函数的一般结构如下:

func TestMain(m *testing.M){
    //测试前:数据装载、数据初始化等前置工作
    
    code := m.Run()
    
    //测试后:释放资源等收尾工作

}

       具体实现如图所示:

image.png

        通常情况下可以使用assert提供的equal方法来判断是否满足期望值与实际值之间的判断,但是如果要使用这个方法,需要go get github.com/stretchr/testify导入对应的包。

        2.2.1代码覆盖率

        对于代码覆盖率他表示语句执行的时候语句真正被执行的语句条数和实际条数的占比。 在Go语言之中使用go test --cover来进行的,如果针对的是某个函数进行的测试的话,需要将该函数所在的源文件以及测试源文件都包含进来,例如go test A.go A_test.go --cover,如果直接使用的是go test --cover那么则是对整个项目进行的代码覆盖率测试,详细的代码覆盖率使用方法可以查看:【go coverage 覆盖率工具】。

三、个人总结

在本篇笔记之中,主要记录了单元测试的具体具体方法,掌握了单元测试是什么,如何使用Go语言所提供的测试工具进行单元测试和代码覆盖率的测试。

四、参考文献

  1. 回归测试
  2. 集成测试
  3. 单元测试
  4. 代码覆盖率
  5. go coverage 覆盖率工具