什么是 Table-Driven 测试模式

165 阅读1分钟

Table-Driven 测试是 Go 常用的组织测试的方式

举例

image.png

示例函数

首先,我们定义一个简单的函数,比如计算整数的绝对值

package main

import "fmt"

type User struct {
    ID   int
    Name string
}

var users = map[int]User{
    1: {ID: 1, Name: "Alice"},
    2: {ID: 2, Name: "Bob"},
}

func GetUserInfo(userID int) (User, error) {
    if user, ok := users[userID]; ok {
       return user, nil
    }
    return User{}, fmt.Errorf("user not found")
}

生成测试文件

image.png

Table-Driven 测试

package main

import (
    "reflect"
    "testing"
)

func TestGetUserInfo(t *testing.T) {
    type args struct {
       userID int
    }
    tests := []struct {
       name    string
       args    args
       want    User
       wantErr bool
    }{
       // TODO: Add test cases.
    }
    for _, tt := range tests {
       t.Run(tt.name, func(t *testing.T) {
          got, err := GetUserInfo(tt.args.userID)
          if (err != nil) != tt.wantErr {
             t.Errorf("GetUserInfo() error = %v, wantErr %v", err, tt.wantErr)
             return
          }
          if !reflect.DeepEqual(got, tt.want) {
             t.Errorf("GetUserInfo() got = %v, want %v", got, tt.want)
          }
       })
    }
}

填充数据

package main

import (
    "reflect"
    "testing"
)

func TestGetUserInfo(t *testing.T) {
    type args struct {
       userID int
    }
    tests := []struct {
       name    string
       args    args
       want    User
       wantErr bool
    }{
       {"user exists", args{1}, User{ID: 1, Name: "Alice"}, t.Failed()},
       {"user does not exist", args{999}, User{}, t.Failed()},
    }
    for _, tt := range tests {
       t.Run(tt.name, func(t *testing.T) {
          got, err := GetUserInfo(tt.args.userID)
          if (err != nil) != tt.wantErr {
             t.Errorf("GetUserInfo() error = %v, wantErr %v", err, tt.wantErr)
             return
          }
          if !reflect.DeepEqual(got, tt.want) {
             t.Errorf("GetUserInfo() got = %v, want %v", got, tt.want)
          }
       })
    }
}