【发布时间】:2016-07-30 18:03:27
【问题描述】:
我刚开始使用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 文件并再次运行 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/pytest?
-
@Rogalski pytest:
python -m py.test test.py和覆盖范围:python -m coverage run sample.py(在 Windows 上) -
它没有显示 100%,它显示的行与未覆盖的行相同……它仍然对我不起作用。我复制粘贴了你的代码,并确保我有 py.test 和 coverage.py 和 pip。我在命令行和 intellij 中看到相同,请 LMK。
标签: python unit-testing python-3.x coverage.py