1. 背景
1.1 推荐框架
用途 | 业内常用框架 |
---|---|
测试框架 | testing、testify, goconvery |
mock框架 | gomock、gomonkey |
1.2 测试类型定义
从多个维度将测试用例分成了A0~A3共3个层级, 详见下表:
测试层级 | A0 | A1 | A2 | A3 |
---|---|---|---|---|
验证范围 | 方法、类 | 服务内部模块间集成 | 单服务接口 | 多服务多接口串联场景 |
单用例执行耗时上限 | <=1S | <=3S | <=10S |
|
稳定性 | 高 | 高 | 中 | 中 |
测试用例与被测对象 | 同进程/同机器 | 同进程/同机器 | 跨进程/同或不同机器 | 不同机器跨进程 |
网络依赖 | 不依赖 | 建议依赖本地网络 | 依赖 | 依赖 |
服务依赖 | 不依赖 | 建议依赖本地测试替身 | 建议依赖非替身 | 依赖非替身 |
数据库依赖 | 不依赖 | 建议依赖本地数据库 | 访问网络数据库 | 访问网络数据库 |
执行网络 | DEV | DEV | IDC | IDC |
需要部署启动被测对象 | 不需要 | 不需要 | 需要 | 需要 |
测试类型 | 白盒测试/单元测试 | 白盒测试/单元测试 | 黑盒测试/接口测试 | 黑盒测试/集成测试(e2e测试) |
2. 测试用例规范
2.1 A0、A1用例
类别 | 规范说明 | |
---|---|---|
存放位置 | 【必须】测试代码 与 被测源码 放在相同目录 | |
测试文件命名规范 | 【必须】测试文件名以 | |
测试用例命名规范 | 【必须】用例名以 | |
用例作者注释 | 【可选】可以添加文件级别作者注释, |
代码结构示例
代码语言:txt复制├── 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
示例代码
代码语言:txt复制// 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用例
类别 | 规范说明 | |
---|---|---|
存放位置(大仓模式) | 【必须】存放在对应子服务模块目录下的test/apitest目录,如 | |
存放位置(小仓模式) | 【必须】放到根目录/test/apitest 目录下,如 | |
测试文件命名规范 | 代码模式:
【必须】代码模式的测试文件名以 | |
测试用例命名规范 | 【必须】用例名以 | |
用例作者注释 | 代码模式:
【可选】可以添加文件级别作者注释, |
代码语言:txt复制代码结构示例--大仓模式
├── 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
代码语言:txt复制代码结构示例--小仓模式
.
├── 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开头: test-xxx 【推荐】仓库根目录/test/e2e目录下( 可以根据实际需要再分类,建立子目录,如:根目录/test/e2e/e2e-pay) |
小仓模式(方案二) | 【必须】放到团队协议仓库里 【推荐】仓库根目录/test/e2e目录下 (可以根据实际需要再分类,建立子目录,如:根目录/test/e2e/e2e-pay) |
小仓模式(方案三) | 【推荐】放在API网关所在仓库 【推荐】根目录/test/e2e目录下(可以根据实际需要再分类,建立子目录,如:根目录/test/e2e/e2e-pay) |
代码结构示例
代码语言:txt复制.
├── 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 命名规范以及作者
类别 | 规范说明 |
---|---|
测试文件命名规范 | 【必须】代码模式的测试文件名以 |
测试用例命名规范 | 【必须】 用例名以 |
用例作者注释 | 代码模式:
【可选】可以添加文件级别作者注释, |