Coverage.py 不会发现子目录中没有 init.py 文件的测试
Posted
技术标签:
【中文标题】Coverage.py 不会发现子目录中没有 init.py 文件的测试【英文标题】:Coverage.py does not discover tests without init.py file in sub directories 【发布时间】:2018-05-18 08:35:49 【问题描述】:当我为 python 运行覆盖时,我总是需要在测试子目录中创建一个空的 __init__.py
文件来获取运行测试的覆盖率。这是 python2 包的要求,但不是 python3 的要求。为了重现,我做了以下操作(先决条件是 python3、pip3 和 brew):
运行以下终端命令:
pip3 install coverage
创建以下目录结构:
example\
example.py
tests\
test_example.py
example.py:
#!/usr/bin/env python3
class Example:
value = 3
def update(self):
self.value = 4
test_example.py:
#!/usr/bin/env python3
import unittest
from example.example import Example
class TestExample(unittest.TestCase):
def test_example(self):
example_object = Example()
self.assertEqual(3, example_object.value)
example_object.update()
self.assertEqual(4, example_object.value)
运行以下终端命令:
coverage run --branch -m unittest discover -s . && coverage report
我应该得到:Ran 1 test in x.yz seconds
,但我总是得到Ran 0 tests in x.yz seconds
,为了解决这个问题,我必须将__init__.py
文件添加到两个目录中。如何在不需要 init 文件的情况下运行覆盖?
如果您需要我就这个问题提供任何其他信息,请告诉我。我将不胜感激!
【问题讨论】:
【参考方案1】:必须指定从顶部到测试文件夹的确切路径。 例如:'python3 -m unittest discover src/main/python/tests'
它最有可能是“单元测试发现”的错误,当您明确指定命名空间包作为发现目标时,发现工作有效。
但它不会递归到 namespace_pkg 内的任何命名空间包。因此,当您简单地运行“python3 -m unittest discover”时,它不会进入 cwd 中的所有命名空间包(基本上是文件夹)。
一些 PR 正在进行中(例如:issue35617)以解决此问题,但尚未发布
【讨论】:
【参考方案2】:虽然 Python 3 不需要 __init__.py
文件,但省略它们会创建命名空间包,如果您不需要它们,这不是一个好主意。例如,它们是最后读取的,因此即使是 PYTHONPATH 后面的目录也可以隐藏您的文件。
无论如何,您都应该创建 __init__.py
文件。
【讨论】:
最后,我想在 2 中指示的结构中添加更多目录,例如 example2/example2SubDir/example2.py 和 example3/example3.py。我还会为这些添加测试文件。根据我读到的关于命名空间包的内容,以及这个特别的评论:***.com/a/21819733/5560776 似乎我需要为我的示例添加初始化文件,对吗? 最佳做法是将__init__.py
文件放入您希望能够导入的任何目录中。以上是关于Coverage.py 不会发现子目录中没有 init.py 文件的测试的主要内容,如果未能解决你的问题,请参考以下文章