【问题标题】:python - Nose not discovering package level tests in Djangopython - 鼻子没有在 Django 中发现包级测试
【发布时间】:2013-08-11 15:01:54
【问题描述】:

我正在为我的 Django 应用程序设置一个目录结构来分离功能测试和单元测试。我正在使用鼻子作为我的 Django 项目的测试运行器。

在 Django 项目的根目录下,我有一个名为“tests”的文件夹,其结构如下:

tests
├── __init__.py
├── functional
│   ├── __init__.py
└── unit
    ├── __init__.py
    ├── data.py
    ├── tests.py

如果我只想运行单元测试,我是否不能从项目根目录中使用以下内容:

$ nosetests tests.unit

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

如您所见,这并没有在 tests.py 文件中找到测试。

但是,当我使用目录结构运行时,会按原样找到测试:

$ nosetests tests/unit/
E
# .. Some errors I expected because settings are not initialized when called this way
-----------------
Ran 1 test in 0.001s

FAILED (errors=1)

我错过了什么?我的主要问题是我在tests.unit.__init__.py 中有一个setup 函数,应该调用它来为即将进行的测试在测试数据库中创建数据。

谢谢

【问题讨论】:

  • 您可能需要在第一个 init 中包含导入单元吗? (只是把它扔在那里)
  • @sihrc 不这么认为,因为我可以使用 python 命令行 python -c 'import tests.unit' 从同一目录导入 unit.tests 模块
  • 您是否尝试在详细模式下运行鼻子?尝试使用-v-vv 看看他们是否提供了有关测试发现的任何提示。

标签: python django nose django-nose


【解决方案1】:

这一切都取决于tests/unit/__init__.py中的代码类型

当你说

nosetests tests.unit

您指向的是unit/__init__.py,而不是unit/ 目录,因此如果您的__init__.py 模块中没有测试,则不会运行任何内容。所以当你说你使用了目录路径然后你的测试开始工作时是可以理解的。

你提到

我错过了什么?我的主要问题是我有一个设置功能 tests.unit.init.py 应该被调用来创建数据 即将进行的测试的测试数据库。

尽管您在 __init__.py 中有设置函数,但您可能从未将测试函数导入 __init__.py

对此的快速解决方法是在__init__.py 中添加这一行

from tests.unit.tests import *

也就是说,将任何代码放在 __init__.py 中确实不是很明智,如果您有返回某种配置数据的代码,我建议创建一个新的库模块,其中包含将返回配置数据的函数你的测试

【讨论】:

  • 感谢您的回答!我对鼻子发现功能的理解是,它希望所有与模式匹配的模块。因此,当我将它指向tests.unit 时,它会找到tests.py,以及里面的所有测试函数。但是现在我添加了from .tests import *,这似乎可以解决问题。有没有办法让nose自动找到测试,而不是手动导入?
  • 是的,如果您希望在目录中自动找到所有测试,只需执行nosetests unit/。正如我所提到的,当您说nosetests tests.unit 时,您是在告诉鼻子查找特定模块中的所有测试。如果该模块没有测试,那么你就不走运了。虽然我不使用太多的模块符号,所以我不能更深入地讲。也许可以查看github.com/nose-devs/nose 的源代码以了解更多信息
猜你喜欢
  • 1970-01-01
  • 2012-10-03
  • 2011-06-03
  • 1970-01-01
  • 2018-09-02
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多