1

我有一个这样的项目:

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 而不是 using 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">
4

1 回答 1

1

不幸的是,这是一个相当讨厌的两部分错误,它跨越了 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,所以当你用 and 调用 PyTest-Cov 时--cov=xxxx--cov-report xml你最终会遇到这个问题。

于 2017-11-20T15:58:42.510 回答