运行WSGI应用程序功能测试的最佳方法?
我正在编写一对简单的WSGI应用程序来感受这个标准,并且我想要测试我的应用程序是否按预期工作。现在我试图找出启动和停止托管这些应用程序的服务器的最佳方式。运行WSGI应用程序功能测试的最佳方法?
我首先想到的是在setUp
方法来启动从wsgiref
的SimpleServer
和关闭它在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)
我不认为SimpleServer
曾经打算在一个线程中运行。在单独的过程中开始SimpleServer
可能会更好,例如,使用stdlib中的subprocess
模块。然后,您可以在setUp
和tearDown
方法中产生/终止进程。
这是一个很好的点,并回答了我原来的问题相当好听,但看它多一些之后,我想介绍关于WebTest的依赖是值得的,在这点。 – 2010-04-13 18:51:52
根据我的经验,在WebTest上引入一个依赖(至少用于测试)是非常值得的。祝你好运! – 2010-04-13 19:48:31