【问题标题】:Best Way to Run Functional Tests of a WSGI Application?运行 WSGI 应用程序功能测试的最佳方式?
【发布时间】:2011-02-07 12:28:27
【问题描述】:

我正在编写一对简单的 WSGI 应用程序来了解标准,并且我想测试我的应用程序是否按预期工作。现在我正在尝试找出启动和停止托管这些应用程序的服务器的最佳方式。

我的第一个想法是在setUp 方法中从wsgiref 启动SimpleServer 并在tearDown 方法中关闭它。由于serve_forever 阻塞,我在单独的Thread 中完成了这项工作。不幸的是,如果我使用serve_forever 启动服务器,它所在的辅助线程永远不会死掉,结果threading 并没有公开杀死Thread 的方法。

现在我正在考虑在服务器的Thread 中使用类似的东西作为我的run 实现:

while keep_going:
    httpd.handle_request()

其中keep_going 是我在setUp 中设置为True 并在tearDown 中设置为False 的变量。

有没有更好的方法?我希望只使用标准库来编写这些应用程序和测试——当我使用 lib/framework 时更好地理解我正在抽象的内容——但这似乎很麻烦。

谢谢。

【问题讨论】:

    标签: python testing wsgi functional-testing


    【解决方案1】:

    测试 WSGI 应用程序的最佳方式是WebTest,这样就无需为您的应用程序生成测试服务器。相反,它允许您向 WSGI 应用程序发出 HTTP 请求,作为对 TestApp 对象的方法调用:

    >>> from webtest import TestApp
    >>> from myapp import my_wsgi_app
    >>> app = TestApp(my_wsgi_app)
    >>> res = app.get('/')
    >>> res.status
    '200 OK'
    >>> res.status_int
    200
    >>> params = {'email': 'foo@example.com', 'password': 'foo', }
    >>> res = app.post('/login/', params)
    >>> res.status_int
    302
    

    我通常有一个基础测试类,它将一个self.app 属性添加到我的测试用例中,该属性指向我正在测试的WSGI 应用程序的TestApp 实例。所以我的测试方法最终看起来像:

    def test_index_page(self):
        res = self.app.get('/')
        self.failUnlessEqual(res.status_int, 200)
    

    【讨论】:

    • 根据我的经验,在 WebTest 上引入依赖项(至少用于测试)是非常值得的。祝你好运!
    【解决方案2】:

    我不认为SimpleServer 曾经打算在线程中运行。您最好在单独的进程中启动SimpleServer,例如使用标准库中的subprocess 模块。然后,您可以在 setUptearDown 方法中生成/终止该进程。

    【讨论】:

    • 这是一个很好的观点,并且很好地回答了我最初的问题,但是在看了更多之后,我认为在这一点上引入对 WebTest 的依赖是值得的。
    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2010-09-08
    • 2017-06-29
    • 1970-01-01
    • 2012-09-07
    • 2014-05-02
    相关资源
    最近更新 更多