【问题标题】:Run Django tests with nosetests用鼻子测试运行 Django 测试
【发布时间】:2018-09-02 01:14:41
【问题描述】:

我的 python 应用程序测试是在远程服务器上使用命令nosetests 执行的。我无法修改测试的启动方式,也无法为其添加选项。我有带有测试的 Django 应用,但测试无法正常工作。

我的项目结构:

project
├── README.md
├── setup.py
├── mysite
│   ├── blog
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── tests.py
|   |   ├── ...
│   ├── db.sqlite3
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── settings.py
|   |   ├── ...

命令nosetestsproject 目录中执行。我希望它能够正确运行 tests.py,它有 2 个 Django 测试用例。我尝试在项目根目录中创建tests 目录并使用DiscoverRunner 调用测试):

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
test_dir = os.path.dirname(os.path.dirname(__file__)) # one level up
sys.path.insert(0, os.path.join(test_dir, 'mysite'))

class ServerTest(unittest.TestCase):
    def test_runtests(self):
        django.setup()
        self.test_runner = DiscoverRunner(verbosity=1, interactive=True, failfast=False)
        failures = self.test_runner.run_tests(['mysite'])
        self.assertEqual(failures, 0)

它可以工作,但问题是所有测试都被视为单个测试,并且服务器会生成错误报告。

另一个解决方案:如果我将空的__init__.py 添加到project/mysite 鼻子发现tests.py 但测试失败,因为'Apps are not loaded yet' 这可能意味着我必须更早调用django.setup() 但我不知道该怎么做它。我找到了一个用于鼻子的插件,但我无法在远程机器上安装插件或更改选项。

任何想法如何使我的任何方法解决问题?

【问题讨论】:

  • 如果您尝试通过python manage.py test在本地运行测试,测试是否正常工作?
  • @BartDur 是的。如果我使用 DiscoveryRunner.run_tests 运行它们,它们也可以正常工作,但它们算作一个测试
  • 你能在远程机器上使用virtualenv吗?
  • 你能在本地使用nosetest 运行它们吗?
  • 你能将文件添加到项目的根目录吗?

标签: python django nose django-nose


【解决方案1】:

首先,你应该安装和配置django-nose,如果你还没有这样做的话:

pip install django-nose

然后将其添加到您的INSTALLED_APPS

INSTALLED_APPS = (
    ...
    'django_nose'
)

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'  

现在要让nosetests 命令正确运行,您可以创建一个名为tests 的文件夹,其结构如下:

project
├── mysite
│   ├── blog
│   │   ├── __init__.py
│   │   ├── models.py
|   |   ├── ...
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── settings.py
|   |   ├── ...
│   ├── tests
│   │   ├── __init__.py
│   │   ├── test_a_whole_class_of_methods.py  
│   │   ├── test_a_whole_view.py  
│   │   ├── test_one_of_my_methods.py
│   │   ├── test_another_one_of_my_methods.py  
|   |   ├── ...
│   ├── db.sqlite3
│   ├── manage.py
├── README.md
├── setup.py

不要忘记tests文件夹中的__init__.py文件!!!

现在,当您从项目的根目录运行 nosetests 时,它将运行 tests 文件夹中的每个测试:

~ $ cd path/to/project
path/to/project $ nosetests

【讨论】:

  • 它尝试运行测试文件夹中的每个测试,但给出“应用程序尚未加载”异常
  • 我认为这是因为nosetests 只是尝试将测试作为跳过django 初始化的python 文件运行
  • @milos 这似乎是一个类似于这些的问题:stackoverflow.com/questions/35086550/…, reddit.com/r/django/comments/7mbk79/… ?
  • 不,这与我的看法完全不同。我们应该以某种方式在测试之前运行 django.setup() 或类似的东西以使测试正常工作。您建议更改答案中的 settings.py(INSTALLED_APPS 和 TEST_RUNNER),但我不认为 nosetests 使用这些更改它只是运行文件
  • @milos 如果你想使用django.setup(),请在测试脚本的开头使用,但是因为我使用的是django-nose,我很确定原因是在你的其他地方代码...
【解决方案2】:

由于您可以将文件添加到项目的根目录,您可以尝试在其中添加一个 setup.cfg 文件,nose 在执行时会在其中查找,并在其中指定查找测试的位置:

# setup.cfg
[nosetests]
where=mysite/blog/

(请参阅documentation 了解您可以在此处输入的参数)。

我不确定这是否可行(启动nose的命令可能已经指定了要使用的不同配置文件),但似乎值得一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 2011-06-03
    • 1970-01-01
    • 2011-07-31
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多