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

2 投票
2 回答
598 浏览
提问于 2025-04-15 21:33

我正在写一对简单的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 模块。这样的话,你就可以在你的 setUptearDown 方法里创建和结束这个进程。

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)

撰写回答