0


Go单元测试以及覆盖率落地于CI门禁

参考谷歌测试金字塔模型,单元测试阶段发现的问题最多,修复成本最低。

单元测试作为测试动作中的第一环,以及测试左移的最左边界,故其重要性不言而喻。

本文会讲述从单元测试的准确率,覆盖率纬度的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')

命令解析
  1. go test: 运行Go语言的测试。go test 比 go run 更严格,故建议使用go test。
  2. -cover: 启用代码覆盖率分析。
  3. -v: 显示详细的测试输出。
  4. -gcflags="all=-N -l":- -N: 禁用优化。- -l: 禁用内联。
  5. -coverprofile=coverage.out: 指定输出覆盖率报告的文件名。
  6. $(go list ./...): 列出当前模块下的所有包。
  7. 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 )

  1. ** git fetch origin master** ​​​​​​获取主分支的代码,默认主分支一般为 master / main。
  2. grep -v ​​​​​过滤无需覆盖的文件。多个文件时使用 ' 文件a | 文件b ' 格式分割。 过滤后生成新的覆盖率文件 coverage_grep.out
  3. go tool cover -html ​​​​​将 .out 格式的覆盖率文件转换为 HTML 格式
  4. gocov convert ​​​将 .out 格式的覆盖率文件转换为 XML 格式
  5. diff-cover coverage_.xml ​​​比较该文件:**coverage_.xml **中的代码覆盖率
  6. compare ​​​与远程主分支比较,通常为 -branch=origin/mainorigin/main
  7. html-report ​​​生成差异文件:**ut_diff_cover_report.html**
  8. 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个较基础的单元测试门禁设置流程进行讲解。基于此思路,可以继续叠加使用其他关键词,以及定制化脚本进行门禁设置的扩展。根据团队的现状和项目的不同阶段,进行门禁的个性化设置。


本文转载自: https://blog.csdn.net/weixin_35947769/article/details/142527161
版权归原作者 Hera酱 所有, 如有侵权,请联系我们删除。

“Go单元测试以及覆盖率落地于CI门禁”的评论:

还没有评论