如何在Python中正确使用coverage.py?
How to properly use coverage.py in Python?
我刚开始使用 Coverage.py 模块,所以决定做一个简单的测试来检查它是如何工作的。
Sample.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
test.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
文件中,然后运行再次覆盖:
然后我添加了这段代码:
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 会在这里失败。
通过你的实验来解析有点困难,而且你没有包括你在每个实验中使用的命令行。但是:如果您 运行 使用以下测试:
python -m py.test test.py
然后你可以 运行 他们在 coverage.py 下:
coverage run -m py.test test.py
Coverage 查找 .coverage 文件来为您读取和生成该报告。 Py.test 本身不会创建一个。您需要 py.test 个插件来覆盖:
pip install pytest-cov
如果您已经拥有它,那么您可以像这样同时运行两者:
py.test test.py --cov=sample.py
这意味着 运行 测试模块 test.py
和 record/display 关于 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
上面的命令只是根据先前测试 运行s 中累积的 .coverage 数据文件显示格式化的覆盖率报告。 -m
表示缺少显示行,即测试未涵盖的行:
Name Stmts Miss Cover Missing
-----------------------------------------
sample.py 6 0 100%
Coverage 支持使用路径模式将 --include
和 --omit
等更多开关转换为 include/exclude 文件。有关更多信息,请查看他们的文档:https://coverage.readthedocs.io/en/6.0.2/source.html?highlight=reporting#reporting
以下命令对我有用:
coverage run --source=sample -m pytest test.py
coverage report -m
将 __init__.py
放入每个测试文件夹即可解决原始问题并显示正确的覆盖范围。
我刚开始使用 Coverage.py 模块,所以决定做一个简单的测试来检查它是如何工作的。
Sample.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
test.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
文件中,然后运行再次覆盖:
然后我添加了这段代码:
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 会在这里失败。
通过你的实验来解析有点困难,而且你没有包括你在每个实验中使用的命令行。但是:如果您 运行 使用以下测试:
python -m py.test test.py
然后你可以 运行 他们在 coverage.py 下:
coverage run -m py.test test.py
Coverage 查找 .coverage 文件来为您读取和生成该报告。 Py.test 本身不会创建一个。您需要 py.test 个插件来覆盖:
pip install pytest-cov
如果您已经拥有它,那么您可以像这样同时运行两者:
py.test test.py --cov=sample.py
这意味着 运行 测试模块 test.py
和 record/display 关于 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
上面的命令只是根据先前测试 运行s 中累积的 .coverage 数据文件显示格式化的覆盖率报告。 -m
表示缺少显示行,即测试未涵盖的行:
Name Stmts Miss Cover Missing
-----------------------------------------
sample.py 6 0 100%
Coverage 支持使用路径模式将 --include
和 --omit
等更多开关转换为 include/exclude 文件。有关更多信息,请查看他们的文档:https://coverage.readthedocs.io/en/6.0.2/source.html?highlight=reporting#reporting
以下命令对我有用:
coverage run --source=sample -m pytest test.py
coverage report -m
将 __init__.py
放入每个测试文件夹即可解决原始问题并显示正确的覆盖范围。