go test单元测试详解

目录

介绍&测试范围

测试函数

执行机制

常用执行模式

子测试

帮助函数Helper()

测试覆盖率


 

介绍&测试范围

go test测试是go自带的测试工具,主要包括单元测试和性能测试两大类。

包括了工程目录下所有以_test.go为后缀名的源代码文件,这些文件在编译时不会被编译到最终的可执行文件中。

测试函数

命名
        一般是以Test开头再加自定义函数名

正常:TestAnd

错误:Testand

参数
        测试函数参数只有一个,普通的单元测试均为*testing.T,参数如果不对则会提示:Wrong test signature

        可允许的参数类型如:

    *testing.T:普通单元测试
    *testing.B:benchmark基准测试,一般用于测试性能
    *testing.M:测试主函数,在运行指定测试函数之前首先运行测试文件中的func TestMain(m *testing.M),TestMain运行在主goroutine中。

如待测函数为Add:

func Add(a int, b int) int {return a + b
}

func TestAdd(t *testing.T) {if result := Add(1, 2); result != 3 {t.Errorf("1 + 2 = 3, not %d", result)}if result := Add(-1, -2); result != -3 {t.Errorf("-1 + -2 = -3, not %d", result)}
}

执行机制

go test过程首先扫描*_test.go的文件,会生成一个临时的main包用于调用相应的测试函数,然后构建、运行、产生测试结果,最后清理测试中生成的临时文件。

常用执行模式

1、仅运行一个测试函数

go test -run TestAdd

2、运行一个包下所有的测试函数

根目录下运行指定包

go test awesomeProject/testt 

或进入指定包下再执行

go test -v

其中 -v用于显示具体用例测试结果,不是必须的

注意,当有两个测试函数 TestAdd、TestAdd0时,执行go test -run TestAdd会将这两个都进行测试。

测试打印

测试函数与其它go函数一样都是函数,可使用fmt、log等进行打印,但参数t自带了常用的打印方法:

    // 打印日志t.Log()t.Logf()// 打印错误,遇到错误终止执行t.Fatal()t.Fatalf()// 打印错误,遇到错误继续执行t.Error()t.Errorf()

子测试

子测试是指在测试场景下允许使用t.Run来创建不同的子测试用例。

举例如下:

func TestAdd(t *testing.T) {testsAdd := []struct {a, b intwant int}{{0, 1, 1},{1, 2, 3},{2, 2, 4},{0, -1, -1},{-3, 4, 1},{-3, 1, -2},{-1, -1, -2},{-1, -2, -3},}for _, tt := range testsAdd {t.Run("", func(t *testing.T) {if got := Add(tt.a, tt.b); got != tt.want {t.Errorf("Add(%d,%d) = %d, want %d", tt.a, tt.b, got, tt.want)}})}
}

这种写法直观、清晰,新增用例方便、格式统一。用例正常时结果如下:

PASS
ok      awesomeProject/testt    0.754s

若将第一个用例写错模拟Add函数问题,结果如下:

--- FAIL: TestAdd (0.00s)--- FAIL: TestAdd/#00 (0.00s)f_test.go:35: Add(0,1) = 1, want 2
FAIL
exit status 1
FAIL    awesomeProject/testt    0.669s

帮助函数Helper()

改造上述测试函数,设定写法如下:

func TestAddWithHelper(t *testing.T) {type model struct {a, b intwant int}execRun := func(t *testing.T, tt model) {// t.Helper()if got := Add(tt.a, tt.b); got != tt.want {t.Errorf("Add(%d,%d) = %d, want %d", tt.a, tt.b, got, tt.want)  // 52行}}execRun(t, model{a: 0, b: 1, want: 0})  // 56行 设定错误,模拟测试不通过execRun(t, model{a: 1, b: 2, want: 3})
}

多个自定义execRun在执行时都有出问题的可能,对于上述代码,当不加t.Helper()时提示如下:

--- FAIL: TestAddWithHelper (0.00s)f_test.go:52: Add(0,1) = 1, want 0
FAIL
FAIL    awesomeProject/testt    0.707s
FAIL

可以看到是t.Errorf这一行,不是特别直观,下面加上t.Helper(),结果如下:

--- FAIL: TestAddWithHelper (0.00s)f_test.go:56: Add(0,1) = 1, want 0
FAIL
FAIL    awesomeProject/testt    0.743s
FAIL

可以看到直接提示是56行的问题。

测试覆盖率

go test awesomeProject/testt -run TestAdd0 -cover

其中-cover测试表示本次测试启用覆盖率检测。

覆盖率的含义是,代码被测试套件覆盖的百分比,即测试中至少被运行一次的代码占总代码的比例。

将覆盖率结果生成报告:

go test awesomeProject/testt -run TestAdd0 -cover -coverprofile=a

如上,-coverprofile=a 参数会将覆盖率信息输出到文件a中,接着使用go tool调用本地浏览器来生成一个html格式的报告:

go tool cover -html=a

效果如下 

77b55392177d4665bcbeb85dccffde80.png

加函数测试了,减函数未测试。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/454979.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Lammps】Zhou势函数拟合(python程序)

【Lammps】Zhou势函数拟合(python程序) Zhou合金势主要用于金属的分子动力学模拟 ,下面将主要对lammps自带程序生成相关合金势函数。 早期的Zhou势用Fortran编写,在使用之前需要进行对源代码进行编译,操作较为麻烦&am…

物联网ARM开发-STM32之RTC浅谈

RTC 一.RTC简单介绍 RTC好比我们用来记录时间的一个钟表,他里面有年月日,还可以记录星期,小时,分钟等。是Real Time Clock的缩写,译为实时时钟,本质上是一个独立的定时器。 1. 1 与通用定时器的区别 可以…

jenkins 发布远程服务器并部署项目

安装参考另一个文章 配置maven 和 jdk 和 git 注意jdk的安装目录,是jenkins 安装所在服务器的jdk目录 注意maven的目录 是jenkins 安装所在服务器的maven目录 注意git的目录 是jenkins 安装所在服务器的 git 目录 安装 Publish Over SSH 插件 配置远程服务器 创…

Python 实现 五子棋小游戏【附源码】

引言 五子棋是一种古老而深受欢迎的策略游戏,它具有简单的规则和无穷的变化。作为一种传统的中国棋类游戏,五子棋已经在世界范围内流行起来,并成为智力挑战和休闲娱乐的优秀选择。 规则和玩法: 五子棋使用一个15x15的棋盘&#x…

【RK3288 Android6 T8, 突然无声音问题排查】

文章目录 【RK3288 Android6 T8, 突然无声音问题排查】问题描述问题调查patch 【RK3288 Android6 T8, 突然无声音问题排查】 问题描述 页面上方突然出现音量进度条,小铃铛图标显示静音状态,不再播报语音 手动去安卓设置内查看&a…

【el-tree 文字过长处理方案】

文字过长处理方案 一、示例代码二、关键代码三、效果图 一、示例代码 <divstyle"height: 600px;overflow: auto"class"text item"><el-treeref"tree":data"treeData":props"defaultProps"class"filter-tree&…

活字格V9 嵌入的html与活字格页面数据交互

不想看分析请直接跳到解决方案 项目场景&#xff1a; 活字格V9 嵌入的html与活字格页面的数据交互&#xff08;传值&#xff09;&#xff0c;嵌入的html用了WebSocket来控制硬件&#xff0c;获取的数据无法回传到活字格页面上&#xff0c;且嵌入的html无法使用活字格内置的js及…

Oracle数据表ID自增操作

一、Oracle ID自增长功能介绍 Oracle数据库默认不支持像 SQLServer、MySQL中的自增长&#xff08;auto increment&#xff09;功能&#xff0c;即自动为每一行记录的自增长字段生成下一个值。 二、Oracle ID自增长方法 第一种&#xff0c;通过序列&#xff08;sequence&#…

c++之说_10|自定义类型 union 联合体

之前我们说了一些 struct 结构体 现在来了解新的自定义类型 union 联合体 语法 union ptr {void* fptr;CLassFunPtr p;FunPtr p2;ptr& operator(CLassFunPtr ptr){p ptr;return *this;}ptr& operator(FunPtr Fptr){p2 Fptr;return *this;} } FunPtr_; 我们看到了…

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

【产品升级】SmartPipe升级到版本2.0

在近一个月的攻关和测试下&#xff0c;SmartPipe软件轴线自动识别算法的性能大幅提升&#xff0c;鲁棒性和稳定性进一步增强。近一年来客户累计反馈的多种复杂管路&#xff08;包括带有支管管路、带有压瘪段管路、推弯管、装配管、带有复杂孔洞管路等&#xff09;现在均能够正确…

离散数学——图论(笔记及思维导图)

离散数学——图论&#xff08;笔记及思维导图&#xff09; 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰