我有一个这样的项目:
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">
答案 0 :(得分:0)
不幸的是,这是一个相当讨厌的两部分错误,跨越Py-Coverage和PyTest-Cov。详细信息请参见PyTest-Cov GitHub和Py-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时,您最终会遇到此问题。