0

要在 Django 测试中使用特定的 url-config,您只需指定它:

class MyTests(TestCase):
    urls = 'myproj.myapp.urls'

    def test_myurl(self):
        r = self.client.get('/foo/')  # looks up /foo/ in myproj/myapp/urls.py

但是,它看起来不像实现是线程安全的:

def _urlconf_setup(self):
    if hasattr(self, 'urls'):
        self._old_root_urlconf = settings.ROOT_URLCONF
        settings.ROOT_URLCONF = self.urls
        clear_url_caches()

在我使用 py.test -n8 运行测试套件(使用全部 8 个 CPU)后,我在测试日志中看到 404 错误。

有没有其他人看到/解决了这个问题?

4

3 回答 3

1

py.test -n8调用将启动 8 个子进程。启动 8 个 django 服务器并通过 访问它们是否可能存在问题self.client(...),即它们每个人使用的固定默认端口?

更新:另外,您可能想安装pytest-django 插件,看看它是否有助于使用-n 8.

于 2012-06-11T13:55:33.037 回答
1

我想知道您使用的默认测试数据库是否已保存以一次与 N 个测试进程一起使用

于 2012-06-23T14:27:52.767 回答
1

简短的回答:urls在你的TestCase子类上设置在调用时不是线程安全from py.test -n的,大概是因为不同的线程正在破坏settings.ROOT_URLCONF

有代码django/core/handlers/base.py:get_response()(我也刚刚检查了最新版本),如果存在,它将从请求对象中获取 urlconf,而不是使用settings.ROOT_URLCONF.

那么解决方案是将 的值附加到传递给视图函数self.urlsrequest对象上。Client.py实施此修复后,我们没有看到任何问题,使用-n8.

(如果您已经拥有自己的client.pyand副本testcases.py,则相对容易(~14 loc)从 Client 中删除当前的 urlconf 机器_pre_setup,而是self.urls通过 Client 以便 ClientHandler 可以request在调用之前将其附加到self.get_response()。)

于 2012-07-22T18:34:43.470 回答