我正在编写一对简单的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时,更好地理解我正在抽象的东西 - 但这似乎是一个非常麻烦的事情。
感谢。
答案 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
模块。然后,您可以在setUp
和tearDown
方法中生成/终止该过程。