一文带你了解Go语言中的单元测试
作者:孙琦Ray 发布时间:2024-04-28 09:11:28
基本概念
上一节提到,代码完成的标准之一还包含了单元测试,这部分也是很多开发流程中不规范的地方。写过单元测试的开发人员应该理解,单元测试最核心的价值是为了证明:为什么我写的代码是正确的?也就是从逻辑角度帮你检查你的代码。但是另外一方面,如果从单元测试覆盖率角度来看,单元测试也是非常耗时的,几乎是三倍于你代码的开发时间,所以在很多迭代速度非常快的项目中,单元测试就几乎没人要求了。但是单元测试真的能够从根本上提高代码质量,降低低级错误出现的概率。
示例一:取整函数基本测试
前置条件
Go语言内置了单元测试执行的指令,由于尚未使用Go Modules方法,我们仍然要设置环境变量,才能正确进行测试
export GO111MODULE=off
go test
代码
假设我们对以下函数进行测试
package even
func Even(i int) bool {
return i % 2 == 0
}
单元测试建立步骤
创建一个单元测试,包括如下步骤:
在相同目录下创建一个名为*_test.go的文件
执行go test进行测试,将自动识别这些文件
引入testing包
每一个Case的命名都是以func TestXxx(t *testing.T)
编写单元测试
这里分别对两种场景进行测试,一种是为偶数的情况,一种是为奇数的情况,来检查我们的程序是否按照预期返回,如果不是则抛出异常信息
package even
import "testing"
func TestEven(t *testing.T) {
if !Even(2) {
t.Log("2 should be even!")
t.Fail()
}
}
func TestNotEven(t *testing.T) {
if Even(3) {
t.Log("3 should not be even!")
t.Fail()
}
}
执行go test后
PASS
ok _/root/workspace/go/test_unittest 0.003s
示例二:Fail()函数
func (t *T) Fail() 让测试失败,同一个测试用例中的测试继续执行,后续的测试也会继续执行
package even
import "testing"
func TestTestingFail(t *testing.T) {
// Let create a fake case, we will call FailNow
if Even(2) {
t.Log("All test cases after Fail will still run")
t.Fail()
}
if Even(2) {
t.Log("The test after Fail will still run")
t.Fail()
}
}
func TestAfterFailCase(t *testing.T) {
if Even(2) {
t.Log("This test case after Fail will still run")
t.Fail()
}
}
执行测试后,TestTestingFail中的第二部分也可以继续执行。
--- FAIL: TestTestingFail (0.00s)
even_fail_test.go:8: All test cases after Fail will still run
even_fail_test.go:13: The test after Fail will still run
--- FAIL: TestAfterFailCase (0.00s)
even_fail_test.go:20: This test case after Fail will still run
FAIL
exit status 1
FAIL _/root/workspace/go/test_unittest 0.004s
示例三:FailNow函数
func (t *T) FailNow() 让测试失败,同一个测试用例中的测试不再执行,后续的测试也会继续执行
package even
import "testing"
func TestTestingFailNow(t *testing.T) {
// Let create a fake case, we will call FailNow
if Even(2) {
t.Log("All test cases after FailNow will not run")
t.FailNow()
}
if Even(2) {
t.Log("The test after FailNow will be skipped")
t.FailNow()
}
}
func TestAfterFailNowCase(t *testing.T) {
if Even(2) {
t.Log("This test case after FailNow will still run")
t.FailNow()
}
}
执行后TestTestingFailNow中的第二段测试不再执行,而后面的TestAfterFailNowCase继续执行
--- FAIL: TestTestingFailNow (0.00s)
even_failnow_test.go:8: All test cases after FailNow will not run
--- FAIL: TestAfterFailNowCase (0.00s)
even_failnow_test.go:20: This test case after FailNow will still run
FAIL
exit status 1
FAIL _/root/workspace/go/test_unittest 0.003s
实例四:Log和Fetal函数
func (t *T) Log(args …interface{}) 使用默认格式记录日志,等同于Print(),记录错误日志
func (t *T) Fatal(args …interface{}) 与Log功能相似,但是输出日志后会调用FailNow
package even
import "testing"
func TestTestingFatal(t *testing.T) {
// Let create a fake case, we will call FailNow
if Even(2) {
t.Fatal("All test cases after FailNow will not run")
}
if Even(2) {
t.Fatal("The test after Fatal will not run")
}
}
func TestAfterFatalCase(t *testing.T) {
if Even(2) {
t.Fatal("This test case after Fatal will still run")
}
}
Fatal的执行过程与FailNow相似
--- FAIL: TestTestingFatal (0.00s)
even_fatal_test.go:8: All test cases after FailNow will not run
--- FAIL: TestAfterFatalCase (0.00s)
even_fatal_test.go:18: This test case after Fatal will still run
FAIL
exit status 1
FAIL _/root/workspace/go/test_unittest 0.005s
来源:https://blog.csdn.net/xiaoquqi/article/details/125816871


猜你喜欢
- 本文实例为大家分享了python实现动态人脸捕获的具体代码,供大家参考,具体内容如下步骤载入cv2捕获摄像头获取第一帧图像定义人脸识别信息开
- 通过python与ffmpeg结合使用,可生成进行视频点播、直播的压力测试脚本。可支持不同类型的视频流,比如rtmp或者hls形式。 通过如
- 本文实例讲述了PHP实现动态删除XML数据的方法。分享给大家供大家参考,具体如下:前面介绍了动态添加XML数据的方法,这里在原有Messag
- 前言:之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的动态tab和swiper切换的功能,但是由于自己前端抠脚的原因没有写
- 1.插入语句1.1插入一行有两种:1.以小括号的形式这里注意:如果表名后边不加小括号对应内容,那么默认就是添加所有列2.以set形式inse
- 如今,随着深度学习的发展,python已经成为了深度学习研究中第一语言。绝大部分的深度学习工具包都有python的版本,很多重要算法都有py
- 序言本文所提及的VTD-XML并非本文作者原创,作者只是对它进行介绍。问题通常当我们提起XML的使用时,最头痛的部分便是XML的verbos
- 如下所示:def str_to_hex(s): s = s.split(' ')&nbs
- 字符串类型代码的执行字符串类型代码的执行函数有三个,都是Python的内置函数。eval()执行字符串类型的代码,并返回最终结果。exec(
- 就在刚才,我给GMAIL安装了Twitter插件。安装完插件后,Gmail提示我要连接Twitter的账号才能使用:我顺着提示操作下去,就看
- 先判断是jquery对象还是html对象, 如果是jquery对象, 可以直接用 jquery对象.attr("
- 使用文中提供的代码做一个统计表每天的新增行数及新增存储空间的功能实现步骤如下:1. 创建表创建表,存储每天的表空间占用情况CREATE TA
- 你家中的CD、VCD一定很多吧?是不是常遇到为找一张CD把一抽屉的碟子翻得乱七八糟的情况,你一定没少受埋怨——你不想整理它们一下?如:影片是
- 玩QQ桌球游戏时,有时候用鼠标控制鼠标指针的微小移动比较费劲儿,所以想写个程序,可以用键盘的上下左右键来控制鼠标的移动,每次只移动一个像素。
- 本文实例为大家分享了python实现桌面壁纸切换功能的具体实现方法,供大家参考,具体内容如下大体分为两个部分一、利用爬虫爬取壁纸第一部分爬取
- Microsoft Access 数据库 (.mdb) 文件大小2 G 字节。不
- 目前绝大多数手机都支持WAP 2.0。WAP 2.0的页面设计具有更好的视觉效果,更接近网页。不过由于手机千差万别,手机浏览器的能力也各不相
- 本文实例讲述了python安装cx_Oracle模块常见问题与解决方法。分享给大家供大家参考,具体如下:安装或使用cx_Oracle时,需要
- WMI是Windows系统的一大利器,Python的win32api库提供了对WMI的支持,安装win32api即可使用 WMI。本例通过W
- 学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!这里就简单讨论下python的几种装饰模