结合python覆盖文件?

Posted

技术标签:

【中文标题】结合python覆盖文件?【英文标题】:combine python coverage files? 【发布时间】:2014-11-30 14:01:28 【问题描述】:

我想知道是否可以将 coverage.xml 文件合并到 1 个文件中以在 html 输出中查看全局报告。

我的unit/functional tests 作为第一个命令运行,integration tests 作为第二个命令运行。这意味着我对unit/functional tests 的报道被unit tests 覆盖。

如果我有一些解决方案来解决这个问题,那就太好了,主要是将这些文件合并到一个文件中。

【问题讨论】:

【参考方案1】:

您不能合并 .xml 文件,但可以合并原始数据文件。您的工作流程如下所示:

$ COVERAGE_FILE=.coverage_func coverage run the_functional_tests.py
$ COVERAGE_FILE=.coverage_inte coverage run the_integration_tests.py
$ coverage combine
$ coverage xml

【讨论】:

coverage combine 的警告是文件是通过路径寻址的,因此当覆盖范围被收集并合并到同一目录中时,这可以正常工作,但如果远程执行一个步骤(例如在一个容器),其中 Python 源路径不同。 Coverage.py 有一个功能可以专门帮助解决这个问题:coverage.readthedocs.io/en/v4.5.x/config.html#paths 这似乎经常被人们忽略。我该怎么做才能让它更明显? 我按照上述步骤操作,但收到错误“没有要组合的数据”。该目录已经有两个文件来组合“.coverage_ca”和“.coverage_test”。 @GauravKohli 我尝试了其他方法。您可以在下面找到我的解决方案。【参考方案2】:

我找到了不同的解决方案。我使用了combine 功能(read here) 所以我运行我的覆盖范围:coverage run -p,然后我运行coverage combine

就是这样。它会生成 1 个组合报告。

【讨论】:

coverage combine 将合并一个目录中的所有.coverage_* 文件并创建一个合并的.coverage 文件并删除其他文件。仅在合并不同目录时需要。 带有参数--keep.coverage_* 文件不会被删除。【参考方案3】:

您可以使用附加选项获得相同的结果。假设您在三个 python 脚本上运行覆盖。在第一次覆盖后使用 -a 进行附加。

coverage run first.py
coverage run -a second.py
coverage run -a third.py

打印报告

coverage report -m

输出:报告

Name             Stmts   Miss  Cover   Missing
----------------------------------------------
first.py           97      1    99%   95
second.py            1      0   100%
third.py            10      0   100%
----------------------------------------------
TOTAL               108      1    99%

【讨论】:

我是用这种方式的,但是它们实际上并没有合并! @JingpengWu,它对我有用。你是不是做错了什么?【参考方案4】:

如果您的源代码位于名为my_project 的目录中,如果您在虚拟环境中包含pytestpytest-cov,也可以这样做:

pytest --cov-report html --cov=my_project unit_tests
pytest --cov-report html --cov=my_project --cov-append functional_tests

--cov-append 会将功能测试覆盖率信息添加到运行单元测试时创建的覆盖率文件中。

【讨论】:

【参考方案5】:

我有类似的情况,我有多个包,每个包都有自己的测试,并且使用自己的测试运行程序运行。所以我可以按照这些步骤组合所有的覆盖 xml。

    单独生成覆盖率报告。 您需要导航到每个包并在该包中生成报告。这将创建.coverage 文件。您还可以在 .coveragerc 中添加 [run]parallel=True 以创建附加机器名称和进程 ID 的覆盖率文件。

    汇总所有报告。 您需要将这些包的所有 .coverage 文件复制到 seaparte 文件夹。您可能需要运行批处理或 sh 脚本来复制所有覆盖文件。

    运行结合。 现在,当您拥有所有报告文件后,导航到该文件夹​​,然后运行 ​​coverage combine。这将删除所有覆盖文件并将其合并为一个.coverage 文件。现在你可以运行coverage htmlcoverage xml

【讨论】:

以上是关于结合python覆盖文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Python 覆盖文件中间的一些字节?

如何在 Python 中覆盖文件?

如何在 Python 中覆盖 excel 文件

Python处理并覆盖外部文本文件[重复]

Python 覆盖不会将输出重定向到文件

读取文件,然后在 Python 中覆盖它