首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >py.test给出Coverage.py警告:模块sample.py从未导入

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

Stack Overflow用户
提问于 2017-10-10 01:47:29
回答 2查看 18.3K关注 0票数 24

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

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

代码语言:javascript
运行
复制
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,它不会显示任何警告。

EN

回答 2

Stack Overflow用户

发布于 2019-03-25 21:13:00

简而言之:运行时需要使用模块名称,而不是文件名:pytest --cov sample test.py

您链接的答案(How to properly use coverage.py in Python?)中的一条注释解释说,如果您试图获取其覆盖率的文件是由测试导入的模块,则这似乎不起作用。我能够重现它:

Sample./sample.py

代码语言:javascript
运行
复制
def add(*args):
    return sum(args)

Test./.

代码语言:javascript
运行
复制
from sample import add

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

我得到了同样的错误:

代码语言:javascript
运行
复制
$ 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.

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

代码语言:javascript
运行
复制
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%

pytest-cov文档似乎表明您可以使用PATH,但它可能并不是在所有情况下都有效...

票数 21
EN

Stack Overflow用户

发布于 2021-04-22 06:29:03

dr使用coverage生成统计文件.coverage,然后创建一个仅针对您的特定文件的报告。

代码语言:javascript
运行
复制
coverage run -m pytest .\test\test_named_prng.py
coverage html --include=named_prng.py 

情况

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

代码语言:javascript
运行
复制
\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,其中另一个初始化文件是空的。An example with files is available on my GitHub.

问题

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

根本原因

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

带有pytest的症状

如果您想要在其上创建覆盖率测试的(子)模块是从__init__.py导入的,那么pytest-cov包的选项--cov就不起作用了,如果您使用选项--cov来发布pytest的话。

如果您使用以下命令运行pytest (从namedPrng)

代码语言:javascript
运行
复制
pytest .\test\test_named_prng.py --cov --cov-report=html

您将获得除timeit_meas.py之外的每个.py文件的报告,因为它从来没有导入过:测试、它的初始化、导入的named_prng.py和它的初始化都没有导入。

如果使用以下命令运行pytest

代码语言:javascript
运行
复制
pytest .\test\test_named_prng.py --cov=./ --cov-report=html

然后,显式地告诉coverage (使用pytest调用)包含您所在级别中的所有内容,因此每个.py文件都将包含在报告中。

您希望告诉coverage只在named_prng.py的源代码上创建报告,但是如果您指定要使用--cov的模块

代码语言:javascript
运行
复制
pytest .\test\test_named_prng.py --cov=named_prng --cov-report=html

或者使用--cov=named_prng.py时,您将得到一个警告:

代码语言:javascript
运行
复制
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的症状

人们可以分别运行覆盖率和报告,并希望可以将更详细的选项传递给覆盖率。

通过发布

代码语言:javascript
运行
复制
coverage run -m pytest .\test\test_named_prng.py
coverage html

您将在5个.py文件上获得相同的报告。如果您试图通过以下方式告诉coverage仅使用named_prng.py

代码语言:javascript
运行
复制
coverage run --source=named_prng -m pytest .\test\test_named_prng.py

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

代码语言:javascript
运行
复制
Coverage.py warning: Module named_prng.py was never imported. (module-not-imported)
Coverage.py warning: No data was collected. (no-data-collected)

并且不会创建任何报告。

解决方案

您需要为coverage使用--include开关,不幸的是,它不能在命令行界面中传递给pytest

使用coverage命令行界面

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

代码语言:javascript
运行
复制
coverage run --include=named_prng.py -m pytest .\test\test_named_prng.py
coverage html

或在报告时间。

代码语言:javascript
运行
复制
coverage run -m pytest .\test\test_named_prng.py
coverage html --include=named_prng.py 

使用pytest +设置文件

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

代码语言:javascript
运行
复制
[run]
include = named_prng.py

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46652192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档