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

pyp*_*bot 10 coverage.py pytest

我从这个线程运行了一个示例代码. 如何在Python中正确使用coverage.py?

但是,当我执行此命令时,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)
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*zes 8

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

\n
coverage run -m pytest .\\test\\test_named_prng.py\ncoverage html --include=named_prng.py \n
Run Code Online (Sandbox Code Playgroud)\n

情况

\n

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

\n
\\namedPrng\n\xe2\x94\x82   examples.py\n\xe2\x94\x82   named_prng.py\n\xe2\x94\x82   README.md\n\xe2\x94\x82   timeit_meas.py\n\xe2\x94\x82   __init__.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80test\n        test_named_prng.py\n        __init__.py\n
Run Code Online (Sandbox Code Playgroud)\n

这里namedPrng/__init__.py导入examples.pynamed_prng.py,其中另一个初始化文件为空。\n我的 GitHub 上提供了包含文件的示例。

\n

问题

\n

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

\n

根本原因

\n

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

\n

pytest 的症状

\n

如果您使用 option 发出问题,则使用package--cov的选项,如果您要创建覆盖率测试的(子)模块是从以下位置导入的,则该选项不起作用pytest-covpytest--cov__init__.py

\n

如果你运行 pytest (从namedPrng

\n
pytest .\\test\\test_named_prng.py --cov --cov-report=html\n
Run Code Online (Sandbox Code Playgroud)\n

.py您将获得除 之外的每个文件的报告timeit_meas.py,因为它从未被导入:也不是测试,也不是它的 init,也不是导入的named_prng.py,也不是它的 init。

\n

如果你运行 pytest

\n
pytest .\\test\\test_named_prng.py --cov=./ --cov-report=html\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

您希望告诉覆盖范围仅在 的源代码上创建报告named_prng.py,但是如果您将模块指定--cov

\n
pytest .\\test\\test_named_prng.py --cov=named_prng --cov-report=html\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
Coverage.py warning: Module named_prng.py was never imported. (module-not-imported)\nCoverage.py warning: No data was collected. (no-data-collected)\nWARNING: Failed to generate report: No data to report.\n
Run Code Online (Sandbox Code Playgroud)\n

症状与coverage

\n

人们可以单独运行覆盖范围和报告,并希望可以将更详细的选项传递给覆盖范围。

\n

通过发行

\n
coverage run -m pytest .\\test\\test_named_prng.py\ncoverage html\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
coverage run --source=named_prng -m pytest .\\test\\test_named_prng.py\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
Coverage.py warning: Module named_prng.py was never imported. (module-not-imported)\nCoverage.py warning: No data was collected. (no-data-collected)\n
Run Code Online (Sandbox Code Playgroud)\n

并且不会创建任何报告。

\n

解决方案

\n

您需要使用不幸的是无法在 CLI 中传递到的--include开关。coveragepytest

\n

使用coverage命令行界面

\n

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

\n
coverage run --include=named_prng.py -m pytest .\\test\\test_named_prng.py\ncoverage html\n
Run Code Online (Sandbox Code Playgroud)\n

或在报告时。

\n
coverage run -m pytest .\\test\\test_named_prng.py\ncoverage html --include=named_prng.py \n
Run Code Online (Sandbox Code Playgroud)\n

使用pytest+设置文件

\n

可以pytest通过配置文件进行详细配置调用。在您发布的地方pytest,设置一个.coveragerc包含内容的文件

\n
[run]\ninclude = named_prng.py\n
Run Code Online (Sandbox Code Playgroud)\n

检查覆盖范围对可能的选项和模式的描述。

\n


Sam*_*eau 7

Short answer: you need to run with the module name, not the file name: pytest --cov sample test.py

One comment in the answer you linked (How to properly use coverage.py in Python?) explains that this doesn't seem to work if the file you are trying to get the coverage of is a module imported by the test. I was able to reproduce that:

./sample.py

def add(*args):
    return sum(args)
Run Code Online (Sandbox Code Playgroud)

./test.py

from sample import add

def test_add():
    assert add(1, 2) == 3
Run Code Online (Sandbox Code Playgroud)

And I get the same error:

$ 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.
Run Code Online (Sandbox Code Playgroud)

However, when using the module name instead:

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%
Run Code Online (Sandbox Code Playgroud)

The pytest-cov documentation seems to indicate you can use a PATH, but it might not be working in all cases...