【问题标题】:`python -m unittest discover` does not discover tests`python -m unittest discover` 不发现测试
【发布时间】:2011-02-23 09:20:53
【问题描述】:

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

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

Ran 31 tests in 0.390s

现在 Python 2.7 unittest has discovery,我已经尝试使用

python -m unittest discover

但我明白了

Ran 0 tests in 0.000s

我的目录结构是:

myproj/
    reporter/
    __init__.py
    report.py
    [other app modules]
        tests/
        __init__.py
        test-report.py
        [other test modules]

你知道为什么 unittest 的发现算法找不到测试吗?

我在 Windows 7 上使用 Python 2.7.1 和鼻子 1.0.0。

【问题讨论】:

  • 我刚刚发现如果我将test-report.py 重命名为test_report.py 会发现测试。除非有人能对此有所了解,否则我将向 unittest 模块维护者提交错误报告。
  • 我很惊讶这在鼻子里有效,因为测试报告是不可导入的。

标签: python unit-testing nose unittest2


【解决方案1】:

这种行为是故意的,但文档可以更清楚地说明这一点。如果您查看测试发现部分的第一段,它会说:

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

由此得出的结论是文件名也必须是有效的 Python 模块名。 test-report.py 未通过该测试,因为 test-report 不是合法的 Python 标识符。

一个文档错误建议在-p 模式选项的文档中明确提及这一点,这可能是一个很好的前进方向。

【讨论】:

  • 另请注意,默认发现模式会查找以字符串“test”为前缀的测试模块......这就是我的目标。
  • 文档中哪里说我们必须在测试模块前面加上“test_”关键字?
  • 我过去遇到的另一个问题是使用无效模块名称进行测试。特别是在例如 . test_this_works_with_version_9.1 是无效的模块名称,因此将被忽略。直接运行文件可以工作,因为操作系统没有问题。 TLDR:不要忘记在模块名称(和其他无效字符)中避免使用 .
  • 缺少__init__.py也可能是某个级别不是python包的原因。
  • 我也遇到了问题,我使用了附加“_test”而不是预先附加的单元测试模块名称......(即“data_convert_test”不会被发现,而“test_data_convert”被发现并运行成功)
【解决方案2】:

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

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

【讨论】:

  • 有点吹毛求疵,但 OP 在测试目录中确实有 __init__.py
【解决方案3】:

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

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

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

【讨论】:

  • 这项工作!但是文档中哪里说我们必须在测试模块前面加上“test_”关键字?
  • python -m unittest -h 在“替代用法”下表示-p patternPattern to match test files ('test*.py' default)
  • 具体来说,要让它与“_test”一起使用,您需要在运行测试时将其作为python -m unittest discover -p '*_test.py' 运行,而不是仅使用python -m unittest 来发现测试“test_”的命名约定自动。这是一个对我来说有意义的权衡,因为我宁愿在其他文件旁边看到测试文件,因为这样我可以更轻松地查看我是否缺少测试文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2018-04-09
  • 2013-06-04
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多