【问题标题】:Python coverage badges, how to get them?Python 覆盖率徽章,如何获得它们?
【发布时间】:2015-05-31 12:03:49
【问题描述】:

我正在使用 Python 覆盖率来测试我的应用程序。查看 GitHub 上的其他开发人员,我发现他们有一个小徽章,显示了覆盖率。使用覆盖率,我如何生成这些徽章?

报道徽章是我在下面看到的。

更新:有些包会生成徽章,即nose-htmloutput!酷

【问题讨论】:

  • 不敢点他们。
  • 这些徽章通常链接到提供它们的特定服务。每个徽章通常由不同的服务提供。
  • @Carsten 我看到不同的点击后会转到许多不同的 3rd 方服务。但我真正想知道的是,这是否是由包覆盖率实际生成的东西,即可能包含的覆盖率报告 html。

标签: python django code-coverage


【解决方案1】:

您可以单击这些徽章,它通常会将您带到提供它们的服务。

报道徽章由https://coveralls.io/提供:

Coveralls 是一项网络服务,可帮助您跟踪代码覆盖率,并确保您的所有新代码都被完全覆盖。

只有一个先决条件:

  • 您的代码必须托管在 GitHub 上

一旦您注册并在开发时包含了所需的配置和集成或包,您将获得一个图像 URL 以包含在您的项目文档中; python-coveralls 项目有:

.. image:: https://coveralls.io/repos/z4r/python-coveralls/badge.png?branch=master
    :target: https://coveralls.io/r/z4r/python-coveralls

例如,在他们的 README 中,呈现为:

【讨论】:

  • 谢谢你的回答,我以为这是包裹覆盖率本身产生的东西。谢谢
  • 我找到了没有第三方的包,即nose-htmloutput
  • @OrbiterFleet:请注意,它不会在任何地方托管图像。如果您在谈论他们的 PyPI 和 GitHub 页面上的覆盖图像,那么仍然由 coveralls.io 处理。
  • @OrbiterFleet:nose-htmloutput 本身不做覆盖报告根本,你得到的只是单元测试成功/失败/错误报告。
  • 是的,抱歉刚刚测试,
【解决方案2】:

如果您想自己生成徽章,可以尝试加载总覆盖率,然后创建图像,如下所示:

from PIL import Image, ImageDraw, ImageFont
from coverage import coverage

cov = coverage()
cov.load()
total = cov.report()

# total = 79.0

im = Image.new("RGB", (120, 20))
fnt = ImageFont.load_default()
d = ImageDraw.Draw(im)

d.text((10, 5), "coverage:", fill=(255, 255, 255), font=fnt)
d.rectangle([(80, 0), (150, 20)], fill=(220, 0, 0))
d.text((90, 5), "{:.0f}%".format(total), fill=(0, 0, 0), font=fnt)

【讨论】:

  • 有一个比编写这个程序更简单的方法:使用shields.io
  • @NedBatchelder 是的,我今天也发现了这一点。仍在考虑创建一个模块来制作这些徽章。
【解决方案3】:

我编写了一个 python 徽章生成包,它生成的徽章在视觉上与主要的徽章服务非常相似。它非常灵活,您可以在 python 代码中导入和使用,或者从命令行运行。它很简单,而且是独立的。

您可以设置徽章标签和值,并且可以根据阈值设置颜色。有针对 pylint、覆盖率和管道成功的预置设置,但您可以创建任何您喜欢的徽章。

这里是 github 项目的链接,其中包含更详细的文档:https://github.com/jongracecox/anybadge

使用pip install anybadge安装

示例python代码:

import anybadge

# Define thresholds: <2=red, <4=orange <8=yellow <10=green
thresholds = {2: 'red',
              4: 'orange',
              6: 'yellow',
              10: 'green'}

badge = anybadge.Badge('pylint', 2.22, thresholds=thresholds)

badge.write_badge('pylint.svg')

命令行使用示例:

anybadge --label pylint --value 2.22 --file pylint.svg 2=red 4=orange 8=yellow 10=green

【讨论】:

    【解决方案4】:

    根据 Carsten 的回答,现在 PyPI 上有一个获得 MIT 许可的工具,用于生成 SVG 覆盖率徽章:

    https://github.com/dbrgn/coverage-badge
    https://pypi.python.org/pypi/coverage-badge

    【讨论】:

      【解决方案5】:

      以上所有答案都取决于某些库或第三方提供商(coveralls 等)。

      就我而言,我需要为代码覆盖率生成这样的徽章。我希望它很简单,而不是用不必要的库加载我的 docker 映像,并且减少 CPU 密集度。 我意识到在这种情况下,使用image/svg+xml 比生成 png 文件更有意义。

      这是一个简单的 bash 代码脚本,下面是我认为生成 jpeg/png 文件的优点

      # generate coverage icon
      COVERAGE_BADGE="${COVERAGE_DIR}/coverage.svg"
      
      #Get this coverage from whatever tool you are using. In our case it was go tool cover
      COVERAGE_TEXT="78.3%"
      SVG_XML_DATA='<svg xmlns="http://www.w3.org/2000/svg" width="124" height="20">
      <linearGradient id="b" x2="0" y2="100%">
      <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
      <stop offset="1" stop-opacity=".1"/>
      </linearGradient>
      <mask id="a">
      <rect width="124" height="20" rx="3" fill="#fff"/>
      </mask>
      <g mask="url(#a)">
      <path fill="#555" d="M0 0h52v20H0z"/>
      <path fill="#97CA00" d="M52 0h72v20H52z"/>
      <path fill="url(#b)" d="M0 0h124v20H0z"/>
      </g>
      <g fill="#fff" text-anchor="middle" font-family="Verdana,DejaVu Sans,Geneva,sans-serif" font-size="11">
      <text x="26" y="15" fill="#010101" fill-opacity=".3">gocov</text>
      <text x="26" y="14">gocov</text>
      <text x="87" y="15" fill="#010101" fill-opacity=".3">PLACEHOLDER</text>
      <text x="87" y="14">PLACEHOLDER</text>
      </g>
      </svg>'
      
      SVG_XML_DATA_FILLED=$(sed "s/PLACEHOLDER/$COVERAGE_TEXT/g" <<<"$SVG_XML_DATA")
      echo "$SVG_XML_DATA_FILLED" > $COVERAGE_BADGE
      
      # upload bagde to s3
      aws s3api put-object \
          --bucket dev.team \
          --content-type "image/svg+xml" \
          --key "coverage/${CODEBUILD_SOURCE_VERSION}.svg" \
          --body "${COVERAGE_BADGE}"
      

      我们使用 s3 来托管 svg,但从技术上讲,您可以在任何 http 服务器上托管它

      相对于 png 生成的优势非常明显

      1. 不依赖任何库
      2. 大多数浏览器都支持渲染 图片/svg+xml
      3. 都是文本,没有二进制生成。这很关键 在我们的案例中,代码覆盖率在每次提交时都会运行,我们想要 减少我们的 AWS CPU 时间。

      【讨论】:

        【解决方案6】:

        您可以使用托管在http://badge.kloud51.com 的徽章

        源代码可在 Github 上找到:https://github.com/SavandBros/badge 如果您想了解它,可以查看代码并了解它是如何生成的。

        【讨论】:

          【解决方案7】:

          要完成Carsten's answer and the associated comments,您现在可以使用genbadge 命令行工具(与pip install genbadge 一起安装)为包括pytestcoverageflake8 在内的一些工具生成徽章。提供了使用 shields.io HTTP API 或包中包含的本地 SVG 模板生成此徽章的选项,从而生成如下徽章:

          命令

          > genbadge coverage
          

          应该适合您的需求。有关详细信息,请参阅genbadge documentation,特别是了解如何使这些徽章将用户重定向到 test/coverage/flake8 报告。 (顺便说一句,我是作者;))

          【讨论】:

            【解决方案8】:

            展示这个徽章花了我大约一天的时间,最后我选择了Github Action+Codecov,步骤不能太简单:

            https://github.com/codecov/codecov-action

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-02-02
              • 1970-01-01
              • 2020-05-09
              • 1970-01-01
              • 2020-07-09
              • 2022-01-20
              • 1970-01-01
              相关资源
              最近更新 更多