使用 Go 语言测试代码
介绍
您是否曾经使用过 GitHub 上的某个应用或代码,然后收到错误,但又不知道原因?也许您必须联系供应商或 GitHub 存储库的维护者来寻求帮助。通过适当的测试可以缓解此类情况。
说到代码质量,您首先要考虑的事情之一就是测试代码。从一开始就测试代码是交付充满错误的产品和交付可供消费者使用的产品之间的区别。
在本指南中,您将学习使用内置测试包在 Go 中进行测试的第一步。
Go 测试包
当你使用 Go 以外的其他语言测试代码时,首先想到的问题之一是,我要使用什么库或框架?幸运的是,Go 内置了一个测试包。这意味着测试包是标准库的一部分,你不必使用外部框架。
该软件包支持 Go 软件包的临时和自动化测试。编写测试后,您可以使用go test命令运行它。
go test命令将查看运行命令形式的当前目录中的所有 Go 文件。go test将查找两个关键字:
- 任何以_test.go结尾的 Go 文件
- 所有以Test开头的函数名称
虽然不是强制性的,但函数名称应该以大写T开头。否则,像 Golint 这样的 linters 会向控制台抛出错误。
使用 Go 测试包的一些流行方法包括:
- 以临时方式直接从命令行运行测试。
- 运行自动化测试
- 在管道中运行测试。例如,您可以使用 GitHub Actions 工作流启动 Go 测试。这意味着测试将在代码尝试构建之前运行,因此您从一开始就知道是否出现问题。
基准测试
Go 测试包中包含一个很酷的功能,即基准测试,即查看代码的速度。如果快速代码和快速部署对您来说很重要,那么您可能会发现自己正在用不同的语言测试解决方案。一个例子是测试 Python 和 Go 中的函数,看看哪一个更快。
利用基准测试功能,您可以轻松地对代码进行计时。
测试示例
测试有很多种类型。其中最流行的包括:
- 单元测试
- 集成测试
- 模拟测试
- 冒烟测试
- 回归测试
- 用户验收测试
还有很多其他的。
事实上,不同类型的测试可以写成一整本书(并且有很多书籍可以证明这一点)。
本指南重点关注的关键测试类型是单元测试,该测试可确保代码的每个部分都提供所需的输出,即您所期望的输出。
下面是一个 Go 测试的示例。
package main
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestAddition(t *testing.T) {
x := 2
y := 2
assert.Equal(t, x, y, "x and y should be the same")
}
让我们逐节地回顾一下。
第一部分是创建一个主包。
package main
接下来,指定要导入的包。第一个是标准测试包,第二个是断言包。Assert 提供了一系列测试工具,例如,在单元测试中查看两个值是否相等。
import (
"testing"
"github.com/stretchr/testify/assert"
)
最后,您有了这个功能。该功能由测试必须的几个关键方面组成:
- 首先,函数名以Test开头,这告诉 Go 这个函数不仅仅是一个标准函数,而且还是一个测试函数。
- 参数t的类型为*testing.T。*testing调用类型 testing 的值,类型.T用于管理测试状态和格式化的测试日志。
该函数本身返回一个简单的测试。它测试x和y变量是否都是int 2。要测试这两个变量是否相等,请使用assert包。
assert 包包含:
- t参数让 assert 知道你正在测试该函数
- 传入两个变量x和y是因为它们是你要测试的变量
- 字符串“x 和 why 应该相同”,它告诉Equal()函数期望的结果应该是什么
func TestAddition(t *testing.T) {
x := 2
y := 2
assert.Equal(t, x, y, "x and y should be the same")
}
将代码保存到 Go 文件中。请记住,Go 文件需要以_test.go结尾。为简单起见,将 Go 文件保存为main_test.go。
要运行测试,请运行以下命令:
go test main_test.go
输出应类似于下面的屏幕截图。
恭喜!您已成功在 Go 中运行单元测试。
结论
在所有情况下,代码质量都很重要,无论是发送给客户的代码还是供团队成员使用的代码。有一件事是真的:代码必须能用。你编写的代码在那一刻可以正常工作,但一旦提交到源代码管理中,除非你每五分钟手动测试一次,否则你根本不知道它是否会再次正常工作。
通过测试,您可以消除测试代码的手动过程并实现测试过程的自动化。它节省您的时间,并通过确保与之交互的代码按预期工作来帮助每个人。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~