运行WSGI应用程序功能测试的最佳方法?

时间:2010-04-13 15:27:06

标签: python testing wsgi functional-testing

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

我的第一个想法是在SimpleServer方法中从wsgiref启动setUp并在tearDown方法中将其关闭。自serve_forever阻止以来,我在单独的Thread中完成了这项工作。不幸的是,如果我使用serve_forever来启动服务器,它所在的辅助线程永远不会死亡,而事实证明threading没有暴露出杀死Thread的方法。

现在我正在考虑使用类似这样的内容作为服务器run中的Thread实现:

while keep_going:
    httpd.handle_request()

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

有更好的方法吗?我希望只使用标准库来编写这些应用程序和测试 - 当我使用lib / framework时,更好地理解我正在抽象的东西 - 但这似乎是一个非常麻烦的事情。

感谢。

2 个答案:

答案 0 :(得分:3)

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

>>> 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)

答案 1 :(得分:1)

我认为SimpleServer无意在线程中运行。您可能最好在单独的流程中启动SimpleServer,例如使用stdlib中的subprocess模块。然后,您可以在setUptearDown方法中生成/终止该过程。