1. 背景

1.1 推荐框架

用途

业内常用框架

测试框架

testing、testify, goconvery

mock框架

gomock、gomonkey

1.2 测试类型定义

从多个维度将测试用例分成了A0~A3共3个层级, 详见下表:

测试层级

A0

A1

A2

A3

验证范围

方法、类

服务内部模块间集成

单服务接口

多服务多接口串联场景

单用例执行耗时上限

<=1S

<=3S

<=10S

=1S 建议控制在10分钟以内

稳定性

测试用例与被测对象

同进程/同机器

同进程/同机器

跨进程/同或不同机器

不同机器跨进程

网络依赖

不依赖

建议依赖本地网络

依赖

依赖

服务依赖

不依赖

建议依赖本地测试替身

建议依赖非替身

依赖非替身

数据库依赖

不依赖

建议依赖本地数据库

访问网络数据库

访问网络数据库

执行网络

DEV

DEV

IDC

IDC

需要部署启动被测对象

不需要

不需要

需要

需要

测试类型

白盒测试/单元测试

白盒测试/单元测试

黑盒测试/接口测试

黑盒测试/集成测试(e2e测试)

2. 测试用例规范

2.1 A0、A1用例

_test.gologin_pwd_test.goTestTestLoginPwdNoNameTestXxx_YyyTestLoginPwd_NoName// Author: username// Author: username

代码结构示例

├── go.mod
├── go.sum
├── logic
│   ├── login_pwd.go
│   ├── login_pwd_test.go
│   ├── handler
│   │   ├── heartbeat_handler.go
│   │   └── heartbeat_handler_test.go
│   └── init.go
├── main.go
├── readme.md

示例代码

// Author: guirongguo   函数注释。函数注释优先级大于文件注释。不添加则默认取git最后提交
func TestHeartBeat(t *testing.T) {
    req := pb.HeartBeat{}    // 构造请求参数
    req.Msg =  "ping"
    rsp := pb.HelloReply{}
    rsp.Msg =  "pong"
    err := commonService.HeartBeat(context.Background(), req, rsp)
    assert.Nil(t, err)
    assert.Equal(t, req.Msg, rsp.Msg)
}

2.2 A2用例

./application/greeter/test/apitest./application/openapi/test/apitest./test/apitest/_test.goheartbeat_test.goxxx_testcase.jsonheartbeat_testcase.jsonTestTestHeartBeatEmpty// Author: username// Author: username

代码结构示例--大仓模式

├── application
│   ├── greeter                 (服务1)
│   │   ├── logic/..             (服务实现逻辑)
│   │   ├── main.go            (服务1入口)
│   │   ├── test
│   │   │   └── apitest     (服务greeter的 接口用例目录)
│   │   │       ├── heartbeat_test.go
│   │   │       └── heartbeat_testcase.json
│   └── openapi                  (服务2)
│       ├── logic/..                 (服务实现逻辑)
│       ├── main.go                (服务2入口)
│       ├── test
│       │   └── apitest          (服务openapi 的 接口用例目录)
│       │       ├── querymsg_test.go
│       │       └── querymsg_testcase.json
├── go.mod
├── go.sum
├── readme.md

代码结构示例--小仓模式

.
├── go.mod
├── go.sum
├── main.go
├── readme.md
├── test
│   ├── apitest
│   │   ├── init.go
│   │   ├── heartbeat_test.go
│   │   └── heartbeat_testcase.json

2.3 A3用例

2.3.1 存放位置

根目录/test/e2e./test/e2e/e2e-pay

代码结构示例

.
├── application
│   ├── greeter                  (服务1)
│   │   ├── logic/..          (业务逻辑代码)
│   │   ├── main.go
│   │   ├── test/..             (服务1接口测试代码)
│   └── openapi                 (服务2)
│       ├── logic/..            (业务逻辑代码)
│       ├── main.go
│       ├── test/..               (服务2接口测试代码)
├── go.mod
├── go.sum
├── readme.md
└── test
│    └── e2e
│    │  ├── e2e_test.go          (e2e测试用例入口)
│    │  └── net/..                     (e2e依赖其他服务逻辑)

2.3.2 命名规范以及作者

_test.goheartbeat_test.goTestTestE2EHeartBeatEmptyTestE2ETestE2EHeartBeat_Empty// Author: username// Author: username