我刚刚开始使用 Coverage.py 模块,因此决定进行一个简单的测试来检查它是如何工作的。
示例.py
def sum(num1, num2):
return num1 + num2
def sum_only_positive(num1, num2):
if num1 > 0 and num2 > 0:
return num1 + num2
else:
return None
测试.py
from sample import sum, sum_only_positive
def test_sum():
assert sum(5, 5) == 10
def test_sum_positive_ok():
assert sum_only_positive(2, 2) == 4
def test_sum_positive_fail():
assert sum_only_positive(-1, 2) is None
如您所见,我的所有代码都包含测试,并且 py.test 表示所有代码都通过了。我希望 Coverage.py 显示 100% 的覆盖率。嗯,不。
嗯,Coverage.py可能看不到test.py文件,所以我将测试函数复制到
sample.py
文件并再次运行Coverage:然后我添加了这段代码:
if __name__ == "__main__":
print(sum(2, 4))
print(sum_only_positive(2, 4))
print(sum_only_positive(-1, 3))
并删除了所有测试功能。之后,Coverage.py 显示 100%:
为什么会这样? Coverage.py 不应该显示代码测试覆盖率,而不仅仅是执行覆盖率吗?我已经阅读了 Coverage.py 的官方 F.A.Q.,但找不到解决方案。
由于很多SO用户都熟悉代码测试和代码覆盖率,我希望你能告诉我,我错在哪里。
我这里只有一个想法:Coverage.py 可能只是观察哪些代码行没有执行,所以我应该为这些行编写测试。但是有些行已经执行但没有被测试覆盖,所以 Coverage.py 在这里会失败。
Coverage 会查找 .coverage 文件来读取并为您生成该报告。 Py.test 本身不会创建一个。您需要 py.test 插件来覆盖:
pip install pytest-cov
如果您已经拥有它,那么您可以像这样同时运行它们:
py.test test.py --cov=sample.py
这意味着运行测试模块
test.py
并在sample.py
上记录/显示覆盖率报告。
如果您需要进行多次测试运行并累积其记录的覆盖率,然后显示最终报告,您可以这样运行:
py.test test.py --cov=sample.py --cov-report=
py.test test.py --cov=sample2.py --cov-report=
py.test test.py --cov=sample3.py --cov-report=
这意味着运行测试模块
test.py
并记录(仅)sample.py
上的覆盖率 - 不显示报告。
现在您可以单独运行覆盖命令以获得完整的报告:
coverage report -m
上面的命令只是根据先前测试运行中累积的 .coverage 数据文件显示格式化的覆盖率报告。
-m
表示显示遗漏的行,即测试未覆盖的行:
Name Stmts Miss Cover Missing
-----------------------------------------
sample.py 6 0 100%
Coverage 支持更多开关,例如
--include
和 --omit
,以使用路径模式包含/排除文件。有关更多信息,请查看他们的文档:https://coverage.readthedocs.io/en/6.0.2/source.html?highlight=reporting#reporting
解析你的实验有点困难,而且你没有包含每个实验使用的命令行。 但是:如果您使用以下命令运行测试:
python -m py.test test.py
然后你可以在coverage.py下运行它们:
coverage run -m py.test test.py
以下命令对我有用:
coverage run --source=sample -m pytest test.py
coverage report -m
将
__init__.py
放入每个测试文件夹中可以解决原始问题并显示正确的覆盖范围。
对于模块,您可以安装coverage和pytest。然后,要运行测试和相应模块的覆盖率,您可以执行以下操作。
这将在目录
tests
中运行 pytests 并使用 pkg_name
作为源。
coverage run --source=pkg_name -m pytest -x tests
然后,当您使用
coverage report
生成报告时,您将获得包中每个脚本的覆盖范围列表 (pkg_name
)。像这样的东西
姓名 | Stmts | 小姐 | 封面 |
---|---|---|---|
pkg_name\main.py | 10 | 10 | 0% |
pkg_name\__init__.py | 3 | 0 | 100% |
pkg_name\module\M1.py | 37 | 29 | 22% |
pkg_name\module_init_.py | 0 | 0 | 100% |
总计 | ### | ### | X% |