python - Gitlab CI 中的覆盖率徽章,Python 覆盖率始终未知

标签 python code-coverage gitlab-ci badge coverage.py

我正在尝试显示报道 badge对于私有(private) Gitlab CE 安装 (v11.8.6) 中的 Python 项目,使用 coverage.py对于 Python。但是,徽章总是显示 unknown .
这是我的 .gitlab-ci.yaml 中的相关工作文件:

coverage:
    stage: test
    before_script:
        - pip3.6 install coverage
        - mkdir -p public
    script:
        - coverage run --source=my_service setup.py test
        - coverage report | tee public/coverage.txt
    artifacts:
        paths:
            - public/coverage.txt
    coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
我希望徽章显示此 URL 的实际覆盖范围,所以这是我在项目设置中输入的内容 General/Badges :
http://<privategitlaburl>/%{project_path}/badges/%{default_branch}/coverage.svg?job=coverage
我读了these instructions使用 Gitlab 页面。但是,我不想仅仅为此目的使用页面,我正在处理一个 Python 项目。
根据 CI/CD 设置和 this post 中的示例, coverage entry 中的正则表达式应该管用。我可以通过在本地尝试来确认:
$ grep -P "TOTAL\s+\d+\s+\d+\s+(\d+%)" public/coverage.txt
TOTAL                                           289     53    82%
我还在 Test coverage parsing 字段中尝试了相同的正则表达式在 CI/CD 下的项目设置中/Pipeline settings ,但同一页面上显示的徽章一直显示 unknown .
文档对我来说不是很清楚,因为它没有描述整个过程。很清楚how to use a badge一旦创建,并且有一个将覆盖率报告发布到页面的手册,但是从提取分数到显示徽章似乎没有明确的路径。
我应该使用 coverage进入我的.gitlab-ci.yaml文件或在管道设置中填写正则表达式?
无论哪种方式,Gitlab CI 是否应该基于此更新覆盖徽章,还是我需要使用其他工具,如 coverage-badge这样做?
提取的覆盖率分数应该报告在哪里;如何确定我的正则表达式是否有效?

最佳答案

我终于在我的 python 项目中获得了显示百分比而不是未知的覆盖率徽章。这是我的 .gitlab-ci.yml 中的相关内容:

job:
 script:
  - 'python -m venv venv'
  - '.\venv\Scripts\activate'
  - 'python -m pip install -r requirements.txt'
  - 'coverage run --source=python_project -m unittest discover ./tests'
  - 'coverage report --omit=things_that_arent_mine/*'
  - 'coverage xml'
 artifacts:
  reports:
   cobertura: 'coverage.xml'
我还在使用 repo CI/CD Settings > General Pipelines > Test coverage parsing 中列出的 gcovr 正则表达式,我在阅读 this 后发现它以及对 this 的倒数第二条评论:
^TOTAL.*\s+(\d+\%)$
在 repo General Settings > Badges 中,我的徽章链接是:
http://gitlab-server/%{project_path}/-/jobs
我的徽章图片网址是:
http://gitlab-server/%{project_path}/badges/%{default_branch}/coverage.svg
我不太清楚 Cobertura 报告工件的用途(我认为它与 merge requests 密切相关),但我把它放在那里,因为教程让我走上了这条路。我确实确认从 .gitlab-ci.yml 中删除以下内容不会破坏工作页面上的徽章或覆盖率:
  - 'coverage xml'
 artifacts:
  reports:
   cobertura: 'coverage.xml'
删除或评论时:
- 'coverage report --omit=things_that_arent_mine/*'
确实破坏了在 repo 的 CI/CD 作业页面上显示的徽章和覆盖率。我还尝试了一些我在 rubular 中测试过的正则表达式变体但唯一没有导致 gitlab 呕吐的是 gcovr 。
希望这会有所帮助,将这个徽章用于 python 项目所需的东西拼凑起来有点困难和艰巨。
编辑 :
还只是想出了如何为覆盖百分比数字添加一些性感的精确度。如果将 .gitlab-ci.yml 的覆盖报告行更改为:
- 'coverage report --omit=things_that_arent_mine/* --precision=2'
以及 CI/CD 设置 > 常规管道 > 测试覆盖率解析中的正则表达式:
^TOTAL.+?(\d+.\d+\%)$
这应该会给你一个非常精确的覆盖数字,除了你和我之外没有人会关心。但是天哪,我们肯定会知道覆盖率是 99.99% 还是 100%。

关于python - Gitlab CI 中的覆盖率徽章,Python 覆盖率始终未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56135153/

相关文章:

c# - 代码抛出异常后缺少右大括号的代码覆盖率

code-coverage - 有没有一种方法可以在不运行代码的情况下确定代码覆盖率?

gitlab - 更改 Gitlab CI Runner 用户

python - 使用 groupby.sum 后如何仅获取具有最大值的观测值?

python - 如何根据条件对 pandas 数据框进行子集化

ruby-on-rails - 使用 simplecov 对 Rails 应用进行少量测试,代码覆盖率高

yaml - Gitlab-Ci:如何在作业之间共享数据

Gitlab CI管道: add message to discussion from CI pipeline

python - 值错误 : too many values to unpack (expected 2)

python - 自动化构建 LinkedList 的过程