Python Coverage将顶级包名称转换为句点

时间:2017-10-24 22:59:23

标签: python code-coverage pytest pytest-cov

我有一个这样的项目:

proj/ex_secure/__init__.py
proj/ex_secure/base.py
proj/ex_secure/metrics.py
proj/ex_secure/keys.py
proj/tests/test_base.py
proj/tests/test_metrics.py
proj/tests/test_keys.py
proj/.gitignore
proj/.pep8
proj/README.rst
proj/setup.cfg
proj/setup.py

如果我像这样运行pytest

pytest -s --junitxml=pytests.xml --cov-report xml --cov-report term-missing --cov-branch --cov=ex_secure

然后,生成的coverage.xml中的顶级包名为.

<package branch-rate="0.4722" complexity="0" line-rate="0.6801" name=".">

但如果我这样打电话给pytest

pytest -s --junitxml=pytests.xml --cov-report xml --cov-report term-missing --cov-branch --cov=ex_secure.base --cov=ex_secure.metrics --cov=ex_secure.keys

然后顶层包正确命名为ex_secure

<package branch-rate="0.4722" complexity="0" line-rate="0.6801" name="ex_secure">

现在这是一个好的解决方法,但它并不理想。如果我添加更多包,我必须继续枚举它们(或者它们会在覆盖率报告中丢失)。此外,__init__.py并未使用此机制进行覆盖。

我在这里做错了什么?

更新1:

如果我直接运行Python Coverage而不是使用pytest-cov,它会按预期工作:

coverage run --branch --source=ex_secure -m pytest -s --junitxml=pytests.xml
coverage xml

然后:

<package branch-rate="0.4722" complexity="0" line-rate="0.6771" name="ex_secure">

更新2:

如果我像我最初那样运行PyTest,然后直接使用Python Coverage重新生成XML报告,则重新生成的报告会得到纠正,但数字会略有不同:

pytest -s --junitxml=pytests.xml --cov-report xml --cov-report term-missing --cov-branch --cov=ex_secure
coverage xml

然后:

<package branch-rate="0.3058" complexity="0" line-rate="0.4769" name="ex_secure">

1 个答案:

答案 0 :(得分:0)

不幸的是,这是一个相当讨厌的两部分错误,跨越Py-Coverage和PyTest-Cov。详细信息请参见PyTest-Cov GitHubPy-Coverage BitBucket

简而言之,从命令行调用coverage xml不允许您传入sources,因此大多数人都不会看到此问题,但您可以传入sources使用Python API进行Py-Coverage时,该API无法正确处理sources属性。同时,PyTest-Cov使用Python API进行Py-Coverage,因此当您使用--cov=xxxx--cov-report xml调用PyTest-Cov时,您最终会遇到此问题。