非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第15章 Go命令行工具
- 15.5 代码测试(test)
- 15.5.1 单元测试
第15章 Go命令行工具
15.5 代码测试(test)
go test命令用于对Go语言编写的代码包进行测试。
可以指定要测试的文件,也可以直接对整个包进行测试,但需要包中含有测试文件,测试文件都是以“_test.go”结尾。
代码测试的目的是确保代码按照你的设想执行,编写测试代码可以尽早地发现程序所存在的问题。
15.5.1 单元测试
在Go语言中可以使用测试框架test编写单元测试,使用命令行即可对代码进行测试及输出测试报告。
单元测试的目的是发现产品代码是否存在功能性问题,代码是否存在缺陷、是否按预期运行,因此,一个测试函数的结果要么是通过(PASS),要么是失败(FAIL)。
和其他语言相比,Go语言的测试是非常高效的,开发者不用花费太多的时间就能写出较为全面的测试代码。
要编写测试代码就需要导入测试框架testing。单元测试的函数名使用“Test”为前缀,后面为要测试的函数名,并且需要传入*testing.T类型的参数。
例如要编写函数Add的测试代码,需要使用如下方式:
func TestAdd(t *testing.T) {
// 测试代码
}
[ 动手写15.5.1]
package main
const PI float64 = 3.14
// 两数相加
func Add(a, b int) int {
return a + b
}
// 求圆的面积
func Area(r float64) float64 {
return PI * r * r
}
动手写15.5.1定义了两个函数Add和Area,我们现在来尝试编写关于这两个函数的单元测试代码。
例如对Add函数的测试代码如下,其中t.Error表示在测试不通过时,打印输出错误信息。
func TestAdd(t *testing.T) {
if Add(1, 3) != 4 {
t.Error("Add 函数存在问题")
}
}
package main
import "testing"
const PI float64 = 3.14
// 两数相加
func Add(a, b int) int {
return a + b
}
// 求圆的面积
func Area(r float64) float64 {
return PI * r * r
}
func TestAdd(t *testing.T) {
if Add(1, 3) != 4 {
t.Error("Add 函数存在问题")
}
}
如果测试通过
如果测试不通过,就会打印如下信息
TestAdd测试函数使用了一个测试数据,然而我们在测试函数时,往往需要测试更多不同维度的数据,如果每组数据都是使用以上方式,代码就会显得冗余且不美观,这时我们可以使用如下方式,给多组数据进行测试。
func TestAdd(t *testing.T) {
inputs := [][]int{{1, 2}, {2, 3}, {4, 7}}
expected := []int{3, 5, 11}
for i := 0; i < len(inputs); i++ {
ret := Add(inputs[i][0], inputs[i][1])
if ret != expected[i] {
t.Errorf("input is %d , the expected is %d , the actual %d", inputs[i], expected[i], ret)
}
}
}
妙啊
inputs为函数的参数数组,expected为使用该函数期望得到的返回值,以上代码测试了三组数据。
当然,如果想要测试更多数据,直接在inputs和expected添加就可以了,运行结果:
当然这是全对 的情况,搞错一个
没毛病
同理 测试计算面积那个函数
func TestArea(t *testing.T) {
inputs := []float64{1, 2, 4}
expected := []float64{3.14, 12.56, 50.24}
for i := 0; i < len(inputs); i++ {
ret := Area(inputs[i])
if ret != expected[i] {
t.Errorf("input is %f , the expected is %f ,the actual %f", inputs[i], expected[i], ret)
}
}
}
测试结果
没毛病
测试代码编写完后,可以使用go test命令对指定文件进行单元测试,-v参数表示输出详细信息,
小改了一下文件名,不影响
可以看见所有函数都通过了测试,结果为PASS。