【go从零单排】go语言中testing的几种类型
🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
Go 语言中的 testing 包是用于编写和运行测试的标准库。它提供了丰富的功能,帮助开发者创建单元测试、基准测试以及示例测试。
💻代码
Example
package main
import (
"fmt"
"testing" //testing:提供测试功能的包,包含了编写和运行测试所需的工具。
)
// IntMin 函数接受两个整数 a 和 b,返回较小的那个值。
func IntMin(a, b int) int {
if a < b {
return a
}
return b
}
// TestIntMinBasic 是一个基本的测试用例,测试 IntMin(2, -2) 的返回值是否为 -2。
// 如果返回值不符合预期,使用 t.Errorf 记录错误信息。
func TestIntMinBasic(t *testing.T) {
ans := IntMin(2, -2)
if ans != -2 {
t.Errorf("IntMin(2, -2) = %d; want -2", ans)
}
}
// TestIntMinTableDriven 是一个表驱动测试,用于测试多个输入情况。
func TestIntMinTableDriven(t *testing.T) {
//定义了一个结构体数组 tests,每个结构体包含两个输入值 a 和 b,以及期望的返回值 want。
var tests = []struct {
a, b int
want int
}{
{0, 1, 0},
{1, 0, 0},
{2, -2, -2},
{0, -1, -1},
{-1, 0, -1},
}
for _, tt := range tests {
testname := fmt.Sprintf("%d,%d", tt.a, tt.b)
//用 t.Run 方法为每个测试用例创建一个子测试,便于独立运行和报告结果。
t.Run(testname, func(t *testing.T) {
//在循环中,调用 IntMin 函数,并检查返回值是否与预期相符。
ans := IntMin(tt.a, tt.b)
if ans != tt.want {
t.Errorf("got %d, want %d", ans, tt.want)
}
})
}
}
// BenchmarkIntMin 是一个基准测试,用于测量 IntMin 函数的性能。
func BenchmarkIntMin(b *testing.B) {
//b.N 是基准测试框架自动确定的迭代次数,循环调用 IntMin(1, 2),以测量其执行时间。
for i := 0; i < b.N; i++ {
IntMin(1, 2)
}
}
Example2
package main
import (
"fmt"
"testing"
)
// 示例函数
func Add(a, b int) int {
return a + b
}
// 单元测试
func TestAdd(t *testing.T) {
got := Add(2, 3)
want := 5
if got != want {
t.Errorf("Add(2, 3) = %d; want %d", got, want)
}
}
// 基准测试
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}
// 示例测试
func ExampleAdd() {
fmt.Println(Add(2, 3))
// Output: 5
}
命令行参数
package main
import (
"fmt"
"os"
)
func main() {
argsWithProg 包含所有命令行参数,包括程序名称。
argsWithProg := os.Args //os.Args 是一个字符串切片,包含命令行参数。第一个元素是程序的名称,后面的元素是传递给程序的参数
//argsWithoutProg 通过切片操作 os.Args[1:] 获取不包含程序名称
argsWithoutProg := os.Args[1:]
//这行代码尝试获取第四个命令行参数(索引为 3),并将其赋值给变量 arg。
arg := os.Args[3] //注意:如果命令行参数不足四个,这行代码会导致运行时错误(index out of range)。
fmt.Println(argsWithProg)
fmt.Println(argsWithoutProg)
fmt.Println(arg)
}
🔍理解
- 使用 testing.T 类型来进行单元测试,提供了报告错误和失败的功能。
- 使用 testing.B 类型来编写基准测试,测量代码的性能和执行时间。
- 使用 t.Error 或 t.Errorf 方法报告错误。
- 使用 t.Skip 方法跳过某个测试。
- 使用 go test 命令运行测试
- 使用 -bench 标志运行基准测试。
- 在实际使用中,应该添加对命令行参数数量的检查
💪无人扶我青云志,我自踏雪至山巅。