Coverage.py 不会发现子目录中没有 init.py 文件的测试

Coverage.py does not discover tests without init.py file in sub directories

当我 运行 覆盖 python 时,我总是需要在测试子目录中有一个空的 __init__.py 文件来覆盖 运行 测试。这是 python2 软件包的要求,而不是 python3 的要求。为了重现,我做了以下操作(先决条件是 python3、pip3 和 brew):

  1. 运行以下终端命令:

    pip3 install coverage
    
  2. 创建以下目录结构:

    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)
  1. 运行以下终端命令:

    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 文件添加到两个目录。我怎样才能 运行 覆盖而不需要初始化文件?

如果您需要我提供有关此问题的任何其他信息,请告诉我。如果有任何帮助,我将不胜感激!

尽管 Python 3 不需要 __init__.py 文件,省略它们会创建命名空间包,如果您不需要它们,这不是一个好主意。例如,它们是最后读取的,因此即使是 PYTHONPATH 后面的目录也可以隐藏您的文件。

无论如何您都应该创建 __init__.py 个文件。

必须指定从顶部到测试文件夹的确切路径。 例如:'python3 -m unittest discover src/main/python/tests'

这很可能是 'unittest discovery' 的错误,当您明确指定命名空间包作为发现目标时,发现会起作用。

但它不会递归到 namespace_pkg 内的任何命名空间包中。因此,当您简单地 运行 'python3 -m unittest discover' 它不会进入 cwd.

中的所有命名空间包(基本上是文件夹)下

一些 PR(例如:issue35617)正在修复此问题,但尚未发布