【问题标题】:Access Django testserver from Django test从 Django 测试访问 Django 测试服务器
【发布时间】:2023-03-13 01:52:01
【问题描述】:

我想编写一个直接执行 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)测试将尝试再次初始化数据库(在测试服务器已经初始化它之后)。

还有其他解决方案吗?

谢谢。

【问题讨论】:

    标签: django unit-testing thrift


    【解决方案1】:

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

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

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

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

    请注意:

    • 请不要用错误报告给 Django 开发人员带来错误,您只能靠自己
    • Windmill 提供了相同的解决方案,所以如果您使用的是 Windmill,您可能会遇到端口冲突

    【讨论】:

    • 感谢您的精彩回答!不过对我来说听起来有点矫枉过正。我想我现在就走简单的路。这将是:编写一个连接到测试服务器的普通测试(不是 Django - 所以它不会弄乱数据库),应该事先启动。在测试设置中,如果连接失败,显示一条很好的消息,例如“请启动您的 Django 测试服务器”。 :)
    • @Almad:[Offtopic] 在我们的斯拉夫语言中,以大写字母开头的代词看起来不错。但是在英语中,不知何故不适合并破坏了句子的连续性。 :)
    • @TomaszZielinski {Offtopic] 代词“I”总是大写的,当你在远离句子开头的任何其他代词大写时,你指的是一个神或一组神。
    【解决方案2】:

    如果您想使用真实的 HTTP 请求测试您的应用程序,请使用 Django 附带的LiveServerTestCase or 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 运行测试。

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2016-02-11
      • 1970-01-01
      • 2020-11-26
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多