asgi web应用程序的测试clietn
asgi-testclient的Python项目详细描述
asgi测试客户端
测试asgi应用程序变得简单!
为什么?
why当所有web框架都附带一个框架时,您会构建这个框架吗?好吧,因为大多数web框架都必须自己构建。我可能是在构建自己的web框架(研究和学习目的),并达到了需要一个TestClient
的程度,但随后a问我自己为什么构建web框架的人必须在有标准的情况下构建自己的testclient?。好吧,那就安装一个use-it测试客户机;你会安装一个库来使用它的一小部分吗?此客户端没有任何依赖项。
要求
Python 3.6+
它应该在Python3.5上运行,但我还没有测试过。
安装
pip install asgi-testclient
用法
客户机复制请求api,因此如果您使用了request,您应该感到舒服。注意:客户端方法是协程get, post, delete, put, patch, etc..
。
importpytestfromasgi_testclientimportTestClientfrommyappimportAPI@pytest.fixturedefclient():returnTestClient(API)@pytest.mark.asyncioasyncdeftest_get(client):response=awaitclient.get("/")assertresponse.json()=={"hello":"world"}assertresponse.status_code==200
我在这个例子中使用了pytest
,但是您可以使用任何您喜欢的跑步者。
如果您仍然喜欢简单的功能而不是协同工作,则可以使用同步界面:
importpytestfromasgi_testclient.syncimportTestClient@pytest.fixturedefclient():returnTestClient(API)deftest_get(client):response=client.get("/")assertresponse.json()=={"hello":"world"}assertresponse.status_code==200
请注意,如果在异步应用程序内运行,则应使用异步客户端,但仍需要在线程内运行同步客户端。
websockets
如果你在使用asgi,你可能在做一些web套接字的事情。我们还增加了对它的支持,因此您可以轻松测试它。
fromasgi_testclientimportTestClientfrommyappimportAPIasyncdeftest_send():echo_server=TestClient(API)websocket=awaitecho_server.ws_connect("/")formsgin["Hey","Echo","Back"]:awaitwebsocket.send_text(msg)data=awaitwebsocket.receive_text()assertdata==msgawaitwebsocket.close()asyncdeftest_ws_context():client=TestClient(API)asyncwithclient.ws_session("/")aswebsocket:data=awaitwebsocket.receive_text()assertdata=="Hello, world!"
这里有几点需要考虑:
- 使用
ws_connect
时,必须调用websocket.close()
来完成应用程序任务。 - 要在上下文管理器中使用websockets,必须使用
ws_session
,而不是ws_connect
。 - 当等待服务器响应
websocker.receive_*
时,它可能会引发WsDisconnect
。
还有一次,对于那些不想这样异步的人,我们得到了同步版本:p
fromasgi_testclient.syncimportTestClientfrommyappimportAPIclient=TestClient(API)deftest_send_receive_json():websocket=client.ws_connect("/json")json_msg={"hello":"test"}websocket.send_json(json_msg)assertwebsocket.receive_json()==json_msgwebsocket.close()deftest_ws_context():withclient.ws_session("/")aswebsocket:data=websocket.receive_text()assertdata=="Hello, world!"
important:在同步版本中,不能使用send
或receive
,因为它们是协程,而应使用它们的子项send_*
或receive_*
text|bytes|json
。
同步版本也会抛出monkey patching
,因此不能同时使用这两个版本async & sync
。
待办事项:
- [X]支持WebSockets客户端。
- []cookies支持。
- []重定向。
- []支持文件编码
- []流请求和响应
学分
Tom Christie
:我从starlette
测试客户机中获得了灵感。Kenneth ☤ Reitz
:这个包试图复制requests
api。