Golang单元测试命名规范(使用gotests工具)

Golang单元测试命名规范(使用gotests工具) 大家好,

你们是否在使用 https://github.com/cweill/gotests 来生成基于表格的单元测试骨架?如果是的话,你们为测试用例采用了什么样的命名规范?

我指的是自动生成的测试结构体切片中的 “name” 字段:

tests := []struct {
    name           string
    fields         fields
    args           args
    wantExitStatus subcommands.ExitStatus
}

运行这些测试时,输出看起来像这样:

=== RUN   TestAPICmd_Execute
=== RUN   TestAPICmd_Execute/API_cmd_should_call_Server.Start()
--- PASS: TestAPICmd_Execute (0.52s)
--- PASS: TestAPICmd_Execute/API_cmd_should_call_Server.Start() (0.52s)

这是因为我将 name 字段设置为了:

name: "API cmd should call Server.Start()"

有什么建议吗?


更多关于Golang单元测试命名规范(使用gotests工具)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang单元测试命名规范(使用gotests工具)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在使用gotests工具生成表格驱动测试时,测试用例的命名规范通常遵循以下模式:

tests := []struct {
    name    string
    fields  fields
    args    args
    want    int
    wantErr bool
}{
    {
        name: "正常情况-输入有效参数",
        fields: fields{/* ... */},
        args: args{/* ... */},
        want: 100,
        wantErr: false,
    },
    {
        name: "边界情况-输入空值",
        fields: fields{/* ... */},
        args: args{/* ... */},
        want: 0,
        wantErr: true,
    },
    {
        name: "异常情况-输入负数",
        fields: fields{/* ... */},
        args: args{/* ... */},
        want: -1,
        wantErr: true,
    },
}

更具体的命名示例:

tests := []struct {
    name    string
    input   string
    want    string
    wantErr bool
}{
    {
        name:    "正常字符串转换",
        input:   "hello",
        want:    "HELLO",
        wantErr: false,
    },
    {
        name:    "空字符串处理",
        input:   "",
        want:    "",
        wantErr: false,
    },
    {
        name:    "包含数字的字符串",
        input:   "hello123",
        want:    "HELLO123",
        wantErr: false,
    },
}

对于测试函数本身的命名,gotests通常使用Test函数名的格式:

func TestCalculator_Add(t *testing.T) {
    tests := []struct {
        name string
        a    int
        b    int
        want int
    }{
        {
            name: "正数相加",
            a:    2,
            b:    3,
            want: 5,
        },
        {
            name: "负数相加",
            a:    -2,
            b:    -3,
            want: -5,
        },
        {
            name: "正负数相加",
            a:    5,
            b:    -3,
            want: 2,
        },
    }
    
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            calc := &Calculator{}
            if got := calc.Add(tt.a, tt.b); got != tt.want {
                t.Errorf("Add() = %v, want %v", got, tt.want)
            }
        })
    }
}

测试输出会显示完整的测试路径:

=== RUN   TestCalculator_Add
=== RUN   TestCalculator_Add/正数相加
=== RUN   TestCalculator_Add/负数相加
=== RUN   TestCalculator_Add/正负数相加
--- PASS: TestCalculator_Add (0.00s)
    --- PASS: TestCalculator_Add/正数相加 (0.00s)
    --- PASS: TestCalculator_Add/负数相加 (0.00s)
    --- PASS: TestCalculator_Add/正负数相加 (0.00s)
回到顶部