Python Falcon - 测试
Falcon 的测试模块是用于 Falcon 应用的功能测试框架。 它包含各种测试类和实用函数以支持功能测试。 测试框架同时支持 unittest 和 pytest。
我们将使用以下脚本 (myapp.py) 来演示测试功能。 它包含一个 HelloResource 类和一个 on_get() 响应器,该响应器呈现 Hello World 的 JSON 响应。 create() 函数返回添加了使用 '/' URL 注册路由的 Falcon 应用程序对象。
from waitress import serve import falcon import json class HelloResource: def on_get(self, req, resp): """Handles GET requests""" resp.text=json.dumps({"message":"Hello World"}) # This is the default status resp.status = falcon.HTTP_200 # Default is JSON, so override resp.content_type = falcon.MEDIA_JSON def create(): app = falcon.App() hello = HelloResource() app.add_route('/', hello) return app app=create() if __name__ == '__main__': serve(app, host='0.0.0.0', port=8000)
使用 unittest(单元测试)
testing.TestCase 扩展了 unittest 以促进使用 Falcon 编写的 WSGI/ASGI 应用程序的功能测试。 我们需要继承这个基类并编写测试。
TestCase 子类中的测试函数名称为 simulate_*(),其中 '*' 代表 HTTP 方法,如 GET、POST 等。这意味着,我们必须获取 simulate_get() 函数的结果,并将其与断言函数的预期结果进行比较。
simulate_*() 函数有两个参数。
simulate_*(app, route)
以下是 test-myapp.py 的代码。 它执行 simulate_get() 函数并将其结果断言为预期结果,并指示测试是失败还是通过。
from falcon import testing import myapp class MyTestCase(testing.TestCase): def setUp(self): super(MyTestCase, self).setUp() self.app = myapp.create() class TestMyApp(MyTestCase): def test_get_message(self): doc = {'message': 'Hello world!'} result = self.simulate_get('/') self.assertEqual(result.json, doc) if '__name__'=='__main__': unittest.main()
在下面命令的帮助下运行上面的测试 −
python -m unittest test-myapp.py F ============================================================== FAIL: test_get_message (test-myapp.TestMyApp) -------------------------------------------------------------- Traceback (most recent call last): File "E:\falconenv\test-myapp.py", line 17, in test_get_message self.assertEqual(result.json, doc) AssertionError: {'message': 'Hello World'} != {'message': 'Hello world!'} - {'message': 'Hello World'} ? ^ + {'message': 'Hello world!'} ? ^ + -------------------------------------------------------------- Ran 1 test in 0.019s FAILED (failures=1)
使用 Pytest
要使用 PyTest 框架执行测试,您需要使用 PIP 实用程序安装它。
pip3 install pytest
要运行一个测试函数,我们需要一个testing.TestClient类的对象。 它模拟对 WSGI 和 ASGI 应用程序的请求。 该对象首先通过将 Falcon 应用程序对象作为参数获得。
我们运行 simulate_*() 函数并用预期的输出断言其结果,以确定测试是失败还是通过。 在这两个示例中,由于 Hello World 消息中"W"的大小写不同,测试失败。 响应者以大写字母"W"返回它,而测试函数以小写字母返回它。
from falcon import testing import pytest import myapp @pytest.fixture() def client(): return testing.TestClient(myapp.create()) def test_get_message(client): doc = {'message': 'Hello world!'} result = client.simulate_get('/') assert result.json == doc
使用以下命令运行上述测试 −
pytest test-myapp.py –v =========== test session starts ========================== platform win32 -- Python 3.8.6, pytest-7.1.2, pluggy-1.0.0 -- e:\falconenv\scripts\python.exe cachedir: .pytest_cache rootdir: E:\falconenv plugins: anyio-3.5.0 collected 1 item test-myapp.py::test_get_message FAILED [100%] ==================== FAILURES ======================= _____________________________________________________ test_get_message _____________________________________________________ client = <falcon.testing.client.TestClient object at 0x0000000003EAA6A0> def test_get_message(client): doc = {'message': 'Hello world!'} result = client.simulate_get('/') > assert result.json == doc E AssertionError: assert {'message': 'Hello World'} == {'message': 'Hello world!'} E Differing items: E {'message': 'Hello World'} != {'message': 'Hello world!'} E Full diff: E - {'message': 'Hello world!'} E ? ^ - E + {'message': 'Hello World'} E ? ^ test-myapp.py:42: AssertionError ============ short test summary info ================== FAILED test-myapp.py::test_get_message - AssertionError: assert {'message': 'Hello World'} == {'message': 'Hello world!'} ============ 1 failed in 4.11s ========================