Python Falcon 测试
Falcon的测试模块是Falcon应用程序的一个功能测试框架。它包含各种测试类和实用函数,以支持功能测试。该测试框架同时支持 unittest 和 pytest。
我们将使用以下脚本( myapp.py )来演示测试功能。它包含一个 HelloResource 类,其中的 on_get() 响应器可以渲染Hello World的JSON响应。 create() 函数返回Falcon的应用程序对象,该对象添加了一个用 ‘ / ‘ URL注册的路由。
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 ========================