从Django测试访问Django测试服务器

从Django测试访问Django测试服务器,django,unit-testing,thrift,Django,Unit Testing,Thrift,我想编写一个直接执行HTTP请求的单元测试(而不是使用django.test.client.client) 如果您想知道原因,那是因为我想测试从Django应用程序公开的Thrift over HTTP API,并且我想在单元测试中使用Thrift客户端 问题是,在测试期间,服务器实际上没有运行。当使用django.test.client.client时,它将只调用视图函数,而不是实际发出HTTP请求。(如果我错了,请纠正我。) 那么,强制测试框架启动HTTP服务器的最佳方法是什么呢 我尝试编写

我想编写一个直接执行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
from django.contrib.staticfiles.testing import StaticLiveServerTestCase

class Example(StaticLiveServerTestCase):
    def test_example(self):
        subprocess.check_call(["curl", self.live_server_url])
但是这是混乱的(并且实际上不起作用),因为1)我需要睡眠(否则测试将在测试服务器初始化数据库之前开始),2)测试将再次尝试初始化数据库(在测试服务器已经初始化数据库之后)

还有其他解决办法吗


谢谢。

是的,你说得对-这是一个问题,它有一个bug:

只是,然后您可能会遇到多线程问题,故意忽略:

我很沮丧,所以我写了一个库,其中包括在单独的线程中启动live server,然后清理它:。它还通过运行时monkeypatching启动Django的服务器多线程,您可以使用CherryPyHTTP(无论如何,这会更好)

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

请注意:

  • 请不要用bugreports对Django开发人员进行bug测试,这是您自己的事情
  • Windmill提供了相同的解决方案,所以如果您使用Windmill,可能会出现端口冲突

如果要使用真实的HTTP请求测试应用程序,请使用Django附带的

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

./manage.py testserver --addrport 7000 &
PID=$!
sleep 5
./manage.py test --no-input
kill $PID
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

运行测试,谢谢您的回答!不过对我来说,听起来有点过分了。我想我现在就走简单的路吧。这将是:编写一个连接到测试服务器的普通测试(不是Django-因此它不会弄乱数据库),应该事先启动。在测试设置中,如果连接失败,则显示一条漂亮的消息,如“请启动Django测试服务器”。)@阿尔马德:[题外话]在我们的斯拉夫语中,代词以大写字母开头时看起来没问题。但在英语中,这种说法并不合适,而且破坏了句子的连续性@托马斯齐林斯基{Offtopic]代词“I”总是大写,当你将任何其他代词大写时,你指的是一个神或一组神。