7

我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。

如果你好奇为什么——这是因为我想测试我从 Django 应用程序公开的 Thrift-over-HTTP API——并且我想在单元测试中使用 Thrift 客户端。

问题是在测试期间,服务器实际上并没有运行。使用 django.test.client.Client 时,它只会调用视图函数,而不是实际发出 HTTP 请求。(如果我错了,请纠正我。)

那么强制测试框架启动 HTTP 服务器的最佳方法是什么?

我尝试编写一个执行以下操作的 bash 脚本:

./manage.py testserver --addrport 7000 &
PID=$!
sleep 5
./manage.py test --no-input
kill $PID

但这很麻烦(并且实际上不起作用),因为 1)我需要睡眠(否则测试将在测试服务器初始化数据库之前开始)和 2)测试将尝试再次初始化数据库(在testserver 已经对其进行了初始化)。

对此还有其他解决方案吗?

谢谢你。

4

2 回答 2

7

是的,你是对的 - 这是一个问题,并且有一个错误:http ://code.djangoproject.com/ticket/2879

只是,你可能会遇到多线程问题,故意省略:http : //code.djangoproject.com/ticket/10117 http://code.djangoproject.com/ticket/4513 http://code.djangoproject.com/ticket/ 3357

我很沮丧,因此我编写了一个库,其中包括在单独的线程中启动实时服务器并在之后清理它:http: //devel.almad.net/trac/django-sane-testing/。它还通过运行时猴子补丁启动 Django 的多线程服务器,您可以改用cherrypy http(无论如何这更好)。

唯一的问题是它要求您使用鼻子作为测试框架(与标准单元测试 100% 向后兼容,但如果您已经在使用其他东西......)。然后,您可以只使用 --with-django 和 --with-djangoliveserver/--with-cherrypyliveserver。不知道它将如何与节俭一起工作。

请注意:

  • 请不要用错误报告给 Django 开发人员带来错误,你自己一个人
  • Windmill 提供了相同的解决方案,所以如果您使用的是 Windmill,您可能会遇到端口冲突
于 2009-06-18T08:10:10.477 回答
1

如果您想使用真实的 HTTP 请求测试您的应用程序,请使用Django 附带的LiveServerTestCaseor 。StaticLiveServerTestCase

在您的tests.py文件中,添加如下代码:

from django.contrib.staticfiles.testing import StaticLiveServerTestCase

class Example(StaticLiveServerTestCase):
    def test_example(self):
        subprocess.check_call(["curl", self.live_server_url])

然后通过运行运行测试python manage.py test

于 2021-03-19T11:25:14.447 回答