Golang单测模板与测试脚本

[本文出自天外归云的博客园]

遵循——“步骤固定,注释清晰”

单测模板

下面是一个标准的单测模板✍🏻包含的步骤:

  1. 准备测试数据
  2. Mock+Stub(可选,灵活位,在7前即可)
  3. 定义测试用例参数
  4. 定义测试用例预期结果
  5. 定义并初始化测试用例
  6. 遍历用例
  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

 

 
posted @ 2022-05-24 10:53  天外归云  阅读(139)  评论(2编辑  收藏  举报