使用nosetests运行Django测试

9

我使用命令nosetests在远程服务器上测试我的Python应用程序。我不能修改测试的启动方式,也不能添加选项。我有一个Django应用程序和测试,但测试无法正常工作。

我的项目结构如下:

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

project 目录中执行命令 nosetests。我希望它能正确运行包含 2 个 Django 测试用例的 tests.py 文件。我尝试在项目根目录下创建 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)

它能够工作,但问题在于所有测试都被视为单个测试,并且服务器生成了错误报告。
另一个解决方案是:如果我在project/mysite中添加空的__init__.py,nose会发现tests.py,但测试会失败,因为'Apps are not loaded yet',这可能意味着我必须更早地调用django.setup(),但我不知道该如何做。我找到了一个nose插件可以做到这一点,但我无法在远程机器上安装插件或更改选项。
有什么想法可以让我的任何方法解决这个问题吗?

如果您尝试通过 python manage.py test 在本地运行测试,测试是否能够正确工作? - BartDur
@BartDur 是的。如果我使用DiscoveryRunner.run_tests运行它们,它们也能正常工作,但是那时它们会被视为一个测试。 - milos
你能在远程机器上使用 virtualenv 吗? - JACK ZHANG
你能否将文件添加到项目的根目录? - solarissmoke
无法使用 virtualenv,@JACKZHANG - milos
显示剩余5条评论
2个回答

7

首先,如果您还没有安装和配置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

它试图运行测试文件夹中的每个测试,但会出现“应用程序尚未加载”的异常。 - milos
我认为这是因为nosetests只是尝试作为Python文件运行测试,跳过了Django的初始化。 - milos
@milos 这似乎是类似于以下问题:https://dev59.com/mFsW5IYBdhLWcg3wVmGV,https://www.reddit.com/r/django/comments/7mbk79/django_issue_appregistrynotready_apps_arent/? - John Moutafis
1
不,这与我的观点相当不同。我们应该在测试之前以某种方式运行django.setup()或类似的操作,以使测试正常工作。您在回答中建议更改settings.py(INSTALLED_APPS和TEST_RUNNER),但我认为nosetests并不使用这些更改,它只是运行文件。 - milos
如果你想使用 django.setup(),请在测试脚本的开头执行,但是因为我正在使用 django-nose,所以我相信问题出现在代码的其他地方... - John Moutafis
nosetests 命令如何知道它应该使用 django-nose?我的意思是,它只是看到需要运行的一堆测试。 - milos

0

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

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

(请参阅文档,了解可以在此处放置哪些参数)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接