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个较基础的单元测试门禁设置流程进行讲解。基于此思路,可以继续叠加使用其他关键词,以及定制化脚本进行门禁设置的扩展。根据团队的现状和项目的不同阶段,进行门禁的个性化设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hera酱

感谢你为测试技术发展做的贡献~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值