2

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

我的第一个想法是在方法中启动SimpleServerfromwsgiref并在setUp方法中关闭它tearDown。由于serve_forever块,我在单独的Thread. 不幸的是,如果我serve_forever用来启动服务器,它所在的辅助线程永远不会死掉,事实证明threading并没有公开杀死Thread.

现在我正在考虑使用这样的东西作为我run在服务器中的实现Thread

while keep_going:
    httpd.handle_request()

wherekeep_going是我True在 my 中setUp设置并False在 my中设置的变量tearDown

有没有更好的办法?我希望只使用标准库来编写这些应用程序和测试——以便更好地理解我在使用 lib/framework 时抽象出的内容——但这似乎很麻烦。

谢谢。

4

2 回答 2

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向我的测试用例添加一个属性,该属性指向TestApp我正在测试的 WSGI 应用程序的一个实例。所以我的测试方法最终看起来像:

def test_index_page(self):
    res = self.app.get('/')
    self.failUnlessEqual(res.status_int, 200)
于 2010-04-13T17:17:42.390 回答
1

我不认为SimpleServer曾经打算在线程中运行。您最好从SimpleServer一个单独的进程开始,例如使用标准库中的subprocess模块。然后,您可以在您的setUptearDown方法中生成/终止该进程。

于 2010-04-13T17:16:07.713 回答