asgi web应用程序的测试clietn

asgi-testclient的Python项目详细描述


asgi测试客户端

Travis (.org)PyPI - Python VersionPyPIcodecovPyPI - Downloadsblack

测试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!"

这里有几点需要考虑:

  1. 使用ws_connect时,必须调用websocket.close()来完成应用程序任务。
  2. 要在上下文管理器中使用websockets,必须使用ws_session,而不是ws_connect
  3. 当等待服务器响应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:在同步版本中,不能使用sendreceive,因为它们是协程,而应使用它们的子项send_*receive_*text|bytes|json

同步版本也会抛出monkey patching,因此不能同时使用这两个版本async & sync

待办事项:

  • [X]支持WebSockets客户端。
  • []cookies支持。
  • []重定向。
  • []支持文件编码
  • []流请求和响应

学分

  • Tom Christie:我从starlette测试客户机中获得了灵感。
  • Kenneth ☤ Reitz:这个包试图复制requestsapi。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaJSonarray不会从SeekBar读取double   使用另一个类从Java中的2D数组打印用户输入   java ClassNotFoundException的原因   spring调用两个方法以返回Java中的不同页面   httpurlconnection Java禁止的代码错误,但浏览器错误(2)   java画布矩阵转换   java:在另一个java映射中使用“Map”作为值   java“未找到用于解密的证书”(Apache CXF,WSSecurity)   java如何查看JTable中选择的行   java在没有xmlwrappers的情况下重复xml元素序列集   java将垂直直方图打印到控制台   java Spring JDBCTemplate:构造不带特殊字符的JSON   java PayPal RestApi获取用户信息