WSGI应用程序功能测试的最佳运行方式?
我正在写一对简单的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
。
有没有更好的方法呢?我希望能仅用标准库来编写这些应用和测试,这样可以更好地理解当我使用库或框架时,实际上在抽象掉什么,但这似乎太麻烦了。
谢谢。
2 个回答
1
我觉得 SimpleServer
并不是为了在一个线程里运行的。你可以考虑在一个单独的进程中启动 SimpleServer
,比如使用标准库里的 subprocess
模块。这样的话,你就可以在你的 setUp
和 tearDown
方法里创建和结束这个进程。
4
测试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)