使用 pytest 为 web.py 应用程序编写单元测试

write unit test for web.py application by using pytest

我想使用 pytest 为 web.py 应用程序编写单元测试。如何在 pytest 中调用 web.py 服务。

代码:

import web

urls = (
    '/', 'index'
)

app = web.application(urls, globals()) 

class index:
    def GET(self):
        return "Hello, world!"

if __name__ == "__main__":    
 app.run()

可以通过使用python请求模块来完成,当我们运行web.py服务时,它会运行http://localhost:8080/。然后导入requests模块,使用get方法,在response对象中,可以验证结果。没关系。

通过使用 Paste 和 nose,我们也可以根据 web.py 官方文档实现这一点。 http://webpy.org/docs/0.3/tutorial.

pytest有没有类似paste和nose选项的解决方案

是的。实际上,web.py 配方 Testing with Paste and Nose 中的代码几乎可以按原样与 py.test 一起使用,只需删除 nose.tools 导入并适当更新断言。

但是如果您想知道如何以 py.test 风格为 web.py 应用程序编写测试,它们可能如下所示:

from paste.fixture import TestApp

# I assume the code from the question is saved in a file named app.py,
# in the same directory as the tests. From this file I'm importing the variable 'app'
from app import app

def test_index():
    middleware = []
    test_app = TestApp(app.wsgifunc(*middleware))
    r = test_app.get('/')
    assert r.status == 200
    assert 'Hello, world!' in r

由于您将添加更多测试,因此您可能会将测试应用程序的创建重构为固定装置:

from pytest import fixture # added
from paste.fixture import TestApp
from app import app

def test_index(test_app):
    r = test_app.get('/')
    assert r.status == 200
    assert 'Hello, world!' in r

@fixture()
def test_app():
    middleware = []
    return TestApp(app.wsgifunc(*middleware))