py.test给出Coverage.py警告:模块sample.py从未导入

时间:2017-10-09 17:47:29

标签: pytest coverage.py

我从这个帖子中运行了一个示例代码。 How to properly use coverage.py in Python?

然而,当我执行此命令时py.test test.py --cov=sample.py 它给了我一个警告,因此,没有创建报告。

platform linux2 -- Python 2.7.12, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: /media/sf_Virtual_Drive/ASU/CSE565_testand 
validation/Assignments/temp, inifile:
plugins: cov-2.5.1
collected 3 items                                                                                                                                                                                                                      

test.py ...Coverage.py warning: Module sample.py was never imported. (module-not-imported)
Coverage.py warning: No data was collected. (no-data-collected)

任何人都知道为什么coverage.py不起作用?

因此,如果我单独运行coverage run -m py.test test.py,则不会显示任何警告。

2 个答案:

答案 0 :(得分:3)

简短的回答:您需要使用模块名称而不是文件名称来运行:def add(*args): return sum(args)

您链接的答案中的一条评论(How to properly use coverage.py in Python?)解释说,如果您尝试获得覆盖的文件是测试导入的模块,那么这似乎不起作用。我能够重现这一点:

./ sample.py

from sample import add

def test_add():
    assert add(1, 2) == 3

./ test.py

$ pytest --cov sample.py test.py
========================================================================================== test session starts ===========================================================================================
platform darwin -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: /path/to/directory, inifile:
plugins: cov-2.6.1
collected 1 item

test.py .                                                                                                                                                                                          [100%]Coverage.py warning: Module sample.py was never imported. (module-not-imported)
Coverage.py warning: No data was collected. (no-data-collected)
/path/to/directory/.venv/lib/python3.7/site-packages/pytest_cov/plugin.py:229: PytestWarning: Failed to generate report: No data to report.

  self.cov_controller.finish()
WARNING: Failed to generate report: No data to report.

我得到同样的错误:

pytest --cov sample test.py
========================================================================================== test session starts ===========================================================================================
platform darwin -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: /path/to/directory, inifile:
plugins: cov-2.6.1
collected 1 item

test.py .                                                                                                                                                                                          [100%]

---------- coverage: platform darwin, python 3.7.2-final-0 -----------
Name        Stmts   Miss  Cover
-------------------------------
sample.py       2      0   100%

但是,当使用模块名称代替时:

PATH

pytest-cov文档似乎表明您可以使用{{1}},但可能无法在所有情况下都起作用...

答案 1 :(得分:0)

tl;博士 使用 coverage 生成统计文件 .coverage,然后创建仅适用于您的特定文件的报告。

coverage run -m pytest .\test\test_named_prng.py
coverage html --include=named_prng.py 

情况

假设您的包中有一些 python 文件,并且在单个测试文件 (test/test_named_prng.py) 中还有测试用例。您想衡量测试文件在包中某个特定文件 (named_prng.py) 上的代码覆盖率。

\namedPrng
│   examples.py
│   named_prng.py
│   README.md
│   timeit_meas.py
│   __init__.py
│
└───test
        test_named_prng.py
        __init__.py

此处 namedPrng/__init__.py 导入 examples.pynamed_prng.py,其中另一个 init 文件为空。 An example with files is available on my GitHub.

问题

您的问题是,使用 pytestcoverage,您无法将报告范围限定到您的特定文件 (named_prng.py),因为从您的包中导入的所有其他文件也包含在报告。

根本原因

如果您在要导入的模块所在的级别中有 __init__.py,那么 __init__.py 可能会导入比需要更多的文件,因为 __init__.py 将被执行。有一些选项可以告诉 pytest 和 coverage 来限制您要调查的模块,但如果它们涉及您包中的其他模块,它们也会被分析。

pytest 的症状

--cov 的选项 pytest-cov,如果您使用选项 pytest 发出 --cov,则使用该选项,如果(子)模块您想要创建覆盖测试是从 __init__.py 导入的。

如果您运行 pytest(来自 namedPrng

pytest .\test\test_named_prng.py --cov --cov-report=html

除了 .py 之外,每个 timeit_meas.py 文件都会得到一个报告,因为它从来没有被导入:也不是测试,也不是它的 init,也不是导入的 named_prng.py,也不是它的 init。

如果你运行 pytest

pytest .\test\test_named_prng.py --cov=./ --cov-report=html

然后您明确告诉 coverage(使用 pytest 调用)包含您关卡中的所有内容,因此每个 .py 文件都将包含在报告中。

您想告诉coverage 仅针对named_prng.py 的源代码创建报告,但是如果您将模块指定为--cov with

pytest .\test\test_named_prng.py --cov=named_prng --cov-report=html

或者使用 --cov=named_prng.py 你会收到警告:

Coverage.py warning: Module named_prng.py was never imported. (module-not-imported)
Coverage.py warning: No data was collected. (no-data-collected)
WARNING: Failed to generate report: No data to report.

症状 coverage

可以单独运行coverage和report,希望可以将更详细的选项传递给coverage。

通过发行

coverage run -m pytest .\test\test_named_prng.py
coverage html

您会得到关于 5 个 .py 文件的相同报告。如果您试图告诉 coverage 仅使用 named_prng.py by

coverage run --source=named_prng -m pytest .\test\test_named_prng.py

或使用 --source=named_prng.py,您将收到警告

Coverage.py warning: Module named_prng.py was never imported. (module-not-imported)
Coverage.py warning: No data was collected. (no-data-collected)

并且不会创建任何报告。

解决方案

您需要为 --include 使用 coverage 开关,遗憾的是它无法在 CLI 中传递给 pytest

使用 coverage CLI

您可以在代码覆盖率计算期间限制调查范围:

coverage run --include=named_prng.py -m pytest .\test\test_named_prng.py
coverage html

或在报告时间。

coverage run -m pytest .\test\test_named_prng.py
coverage html --include=named_prng.py 

使用 pytest + 设置文件

可以通过配置文件调用具有详细配置的 pytest。在您发出 pytest 的地方,设置包含内容的 .coveragerc 文件

[run]
include = named_prng.py

检查 coverage's description 可能的选项和模式。