`python -m unittest discover`没有发现测试

blo*_*ley 37 python unit-testing nose unittest2

Python的unittest discover没有找到我的测试!

我一直在使用鼻子来发现我的单元测试,它工作正常.从我的项目的顶层,如果我跑,nosetests我得到:

Ran 31 tests in 0.390s
Run Code Online (Sandbox Code Playgroud)

现在Python 2.7 unittest 已经发现,我已经尝试过使用了

python -m unittest discover
Run Code Online (Sandbox Code Playgroud)

但我明白了

Ran 0 tests in 0.000s
Run Code Online (Sandbox Code Playgroud)

我的目录结构是:

myproj/
    reporter/
    __init__.py
    report.py
    [other app modules]
        tests/
        __init__.py
        test-report.py
        [other test modules]
Run Code Online (Sandbox Code Playgroud)

你有什么想法为什么unittest的发现算法找不到测试?

我在Windows 7上使用Python 2.7.1和nose 1.0.0.

nco*_*lan 47

这种行为是故意的,但文档可以使这更清楚.如果你看一下测试发现部分的第一段,它会说:

要使项目的测试与测试发现兼容,它们必须都可以从项目的顶级目录导入(换句话说,它们都必须在Python包中).

这样做的必然结果是文件名也必须是有效的Python模块名称.test-report.py未通过该测试,因为test-report它不是合法的Python标识符.

一个文档错误表明在-p模式选项的文档中明确提到这可能是一个很好的前进方法.

  • 另请注意,默认发现模式查找以字符串"test"为前缀的测试模块......这就是我的意思. (27认同)
  • 缺少 `__init__.py` 也可能是某些级别不是 python 包的原因。 (4认同)

Max*_*ysh 17

我遇到这个问题是因为项目中的某些目录丢失了__init__.py。我以为我在 Python 3.7 中不需要它们。

只需添加__init__.py每个目录,python3 -m unittest就会自动找到测试。

  • 有点挑剔,但 OP 的测试目录中确实有 `__init__.py`。 (6认同)

小智 5

作为Python的新手,文档中的命名约定暗含了相反的含义。Ben的评论非常有帮助:默认发现模式查找以字符串“ test”为前缀的测试模块

我认为自省只会寻找类名,而不需要特定的文件命名约定。

这是文档所说的:https : //docs.python.org/3/library/unittest.html python -m unittest discover -s project_directory -p“ _test.py”我无法使它正常工作,但是通过将我的文件名更改为“ test_ .py”-成功!