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

问题描述:

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

我首先想到的是在setUp方法来启动从wsgirefSimpleServer和关闭它在tearDown方法。由于serve_forever区块,我在单独的Thread中完成了这项工作。不幸的是,如果我使用serve_forever来启动服务器,它所在的辅助线程永远不会死亡,并且事实证明threading没有公开杀死Thread的方法。

现在我使用的是这样的事情是我在run实施考虑服务器的Thread

while keep_going: 
    httpd.handle_request() 

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

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

谢谢。

测试WSGI应用程序的最佳方式是WebTest,它消除了为您的应用程序生成测试服务器的需求。相反,它可以让你做让HTTP请求到你的WSGI应用程序作为方法的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': '[email protected]', 'password': 'foo', } 
>>> res = app.post('/login/', params) 
>>> res.status_int 
302 

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

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

根据我的经验,在WebTest上引入一个依赖(至少用于测试)是非常值得的。祝你好运! – 2010-04-13 19:48:31

我不认为SimpleServer曾经打算在一个线程中运行。在单独的过程中开始SimpleServer可能会更好,例如,使用stdlib中的subprocess模块。然后,您可以在setUptearDown方法中产生/终止进程。

+0

这是一个很好的点,并回答了我原来的问题相当好听,但看它多一些之后,我想介绍关于WebTest的依赖是值得的,在这点。 – 2010-04-13 18:51:52