参考谷歌测试金字塔模型,单元测试阶段发现的问题最多,修复成本最低。
单元测试作为测试动作中的第一环,以及测试左移的最左边界,故其重要性不言而喻。
本文会讲述从单元测试的准确率,覆盖率纬度的3个标准落地于CI门禁中的实践:
1)测试用例全部通过;
2)增量覆盖率>=100%;
3)全量覆盖率>=80%。
单元测试
可以将执行单元测试的脚本编写于独立的shell文件,并在流水线中调用该脚本。
单元测试脚本
位于 test/door.sh 文件中
unit_test()
{
cd ../
pushd ./
go test -cover -v -gcflags="all=-N -l" -coverprofile=coverage.out $(go list ./...|grep -v \
'api/logic\|ddd/proceduce.go')
return 0
}
go test -cover -v -gcflags="all=-N -l" -coverprofile=coverage.out $(go list ./...|grep -v \
'api/logic|ddd/proceduce.go')
命令解析
go test
: 运行Go语言的测试。go test 比 go run 更严格,故建议使用go test。-cover
: 启用代码覆盖率分析。-v
: 显示详细的测试输出。-gcflags="all=-N -l"
:--N
: 禁用优化。--l
: 禁用内联。-coverprofile=coverage.out
: 指定输出覆盖率报告的文件名。$(go list ./...)
: 列出当前模块下的所有包。grep -v 'api/logic\|ddd/proceduce.go'
: 从列出的包中排除特定的路径。这里排除了api/logic
包和ddd/proceduce.go
文件。注意:多个文件使用 **\|
**分割。
.gitlab-ci.yml 配套脚本
test ut:
stage: unit test
script:
- './test/door.sh unit_test'
artifacts:
expire_in: 1 week
paths:
- ./coverage.out
reports:
junit: ./unit-tests.xml
when: on_success
coverage: '/coverage: \d+\.\d+/'
tags:
- ut
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
单元测试覆盖率
执行完单元测试获取到报告后,可以解析设置覆盖率门禁。
单元测试覆盖率脚本
位于 test/door.sh 文件中
#单元测试覆盖率
unit_coverage()
{
cd ../
pushd ./
git fetch origin main
grep -v '.*_mock.go\|scripts' coverage.out > coverage_grep.out
go tool cover -html coverage_grep.out -o ut_full_cover_report.html
if [ $? -ne 0 ]; then
Print "full cover failed!"
return 1
fi
gocov convert coverage_grep.out | gocov-xml > coverage_.xml
if [ $? -ne 0 ]; then
Print "gocov failed!"
return 1
fi
diff-cover coverage_.xml --compare-branch=origin/main --html-report ut_diff_cover_report.html --fail-under=100
if [ $? -ne 0 ]; then
Print $LOG_FATAL "diff-cover failed!"
return 1
fi
return 0
}
命令解析
(前置条件:执行单元测试脚本后,生成了覆盖率文件:coverage.out )
- ** git fetch origin master** 获取主分支的代码,默认主分支一般为 master / main。
- grep -v 过滤无需覆盖的文件。多个文件时使用 ' 文件a | 文件b ' 格式分割。 过滤后生成新的覆盖率文件 coverage_grep.out
go tool cover -html
将.out
格式的覆盖率文件转换为 HTML 格式gocov convert
将.out
格式的覆盖率文件转换为 XML 格式diff-cover coverage_.xml
比较该文件:**coverage_.xml
**中的代码覆盖率compare
与远程主分支比较,通常为-branch=origin/mainorigin/main
html-report
生成差异文件:**ut_diff_cover_report.html
**fail-under=100
设定一个覆盖率阈值。如果变化中的覆盖率低于 100%,则命令将失败。
.gitlab-ci.yml 配套脚本
coverage ut:
stage: unit test
needs: [ test ut ]
script:
- './test/door.sh unit_coverage'
artifacts:
expire_in: 1 week
paths:
- ./*_ut_full_cover_report.html
- ./*_ut_diff_cover_report.html
when: always
coverage: '/Coverage: \d+/'
tags:
- ut
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
当然,本文是基于1个较基础的单元测试门禁设置流程进行讲解。基于此思路,可以继续叠加使用其他关键词,以及定制化脚本进行门禁设置的扩展。根据团队的现状和项目的不同阶段,进行门禁的个性化设置。
版权归原作者 Hera酱 所有, 如有侵权,请联系我们删除。