[本文出自天外归云的博客园]
遵循——“步骤固定,注释清晰”
单测模板
下面是一个标准的单测模板✍🏻包含的步骤:
- 准备测试数据
- Mock+Stub(可选,灵活位,在7前即可)
- 定义测试用例参数
- 定义测试用例预期结果
- 定义并初始化测试用例
- 遍历用例
- 执行待测方法+断言
可以直接复制粘贴下面的空模板代码使用:
package unityportal
import (
"testing"
"xx/mocker"
)
func TestTemplate(t *testing.T) {
// Mock
mock := mocker.Create()
defer mock.Reset()
// 定义测试用例参数
type args struct {
customStub func(*mocker.Builder)
}
// 定义测试用例预期结果
type want struct {
}
// 定义并初始化测试用例
tests := []struct {
name string
args args
want want
}{
{
name: "用例1",
args: args{
customStub: func(mock *mocker.Builder) {
},
},
want: want{},
},
}
// 遍历用例
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// 重置 mock 对象
mock.Reset()
// 执行自定义 stub 过程
tt.args.customStub(mock)
// 执行待测方法
// 断言
})
}
}
其中stub环节的位置是灵活的,有三种stub:
第一种:不同的case有着一样的stub过程,一样的stub返回值
第二种:不同的case有着一样的stub过程,不一样的stub返回值
第三种:不同的case有着不一样的stub过程,不一样的stub返回值
可以灵活使用,只要保证stub过程的调用在执行待测方法前即可。
执行测试用的脚本
把这个脚本放到项目根目录下:
# 该脚本需要cd到测试文件所在目录下执行 method=$1 # 不传入method参数则运行全部测试 cmd="go test -v -coverprofile=test.out -gcflags=all=-l" # 传入method参数则测试指定方法 if [ "$1" != "" ]; then fileList=$(ls) cmd="go test -v" for file in $fileList; do if echo "$file" | grep -q -E '\.go$'; then cmd="${cmd} $file" fi done cmd="$cmd -test.run $method -coverprofile=test.out -gcflags=all=-l" fi # 执行测试 $cmd # 生成测试覆盖率html报告 go tool cover -html=test.out -o test.html
然后在测试代码所在目录下调用执行(举例:TestGenerateReleaseNews方法在project目录下的测试文件中):
sh ../../../exec_test.sh TestGenerateReleaseNews
本文来自博客园,作者:天外归云,转载请注明原文链接:https://www.cnblogs.com/LanTianYou/p/16304695.html
浙公网安备 33010602011771号