在python中,发送http请求,比较有名的是requests这个库;webservice的接口可以使用suds-py3来请求。那么websocket怎么请求呢?
其实在python中也有很多第三方库可以用来发送websocket请求。比如websocket-client, 那么接下来我们先来看看websocket-client这个库的使用。
Python接口自动化测试:https://www.bilibili.com/video/BV16G411x76E/
环境安装
由于websocket-client是第三方库,使用之前需要先安装,安装直接使用pip 命令安装即可。
pip install websocket-client
安装好websocket-client这个模块之后,就可以正式开始使用了,关于使用websocket-client模块创建socket客户端有两种方式。一个是websocket.create_connection方法,还有一个是websocket.WebSocketApp
create_connection
使用方法
建立连接
使用create_connection方法传入websocket的接口地址就可以和接口建立起连接,返回一个连接的客户端对象。
获取连接状态
连接对象有一个getstatus方法,可以用来获取连接状态,如果连接成功了,获取到的状态码即为101。
发送请求参数
建立起连接之后,如果要发送请求参数,则可以使用连接对象的send方法,注意点,send方法发生的请求参数必需是字符串类型。
获取返回结果
连接对象有一个recv方法,专门用来获取返回结果的
关闭连接
由于websocket使用的是tcp长连接,建立连接之后,如果要断开连接,需要调用连接对象的close方法才能断开连接。
案例代码
import json
from websocket import create_connection
# 1、建立连接
ws = create_connection("ws://127.0.0.1:5000/info")
# 2、获取连接状态
print("获取连接状态:", ws.getstatus())
# 3、发送请求参数
ws.send('发送数据 hello musen')
# 4、获取返回结果
result = ws.recv()
print("接收结果:", result)
# 5、关闭连接
ws.close()
关于create_connection的使用就是这么几部操作,使用起来也很方便,一般在测试websocket接口消息发送功能是否正常,发送完消息就断开连接,用这个方法还是比较方便。
不过很多情况下websocket接口只是用来做持续性监听工作,并不涉及到传递请求参数。那么使用websocket中WebSocketApp这个类来测试监听功能会更合适。
WebSocketApp
基本使用
如果要对某个接口进行长期的进行监听,监听其功能是否异常,那么就可以使用webSocketApp这个类来创建一个长连接进行监听。接下来我们一起来看看WebSocketApp这个类源码的初始化方法。
WebSocketApp初始化方法的源码
从上述代码中可以看到WebSocketApp进行初始化的时候定义了很多的参数。接下来给大家介绍几个常用的参数
url : url是用来接收连接的websocket的url地址的
header:header是用来传入建立连接的请求头的
on_message:是用来指定监听到数据返回是的处理方法
on_error:当连接出现错误是,会触发on_error指定的方法
on_close:当连接关闭是,则会触发on_close方法
其他的参数 大家可以去看官方文档,这边就不给大家一一说明了。
WebSocketApp对象的run_forever方法
创建了一个连接对象之后,需要不断监听返回的数据,则调用run_forever方法,要保持长连接即可,接下来我们来看一个使用案例。
案例代码
需求:监测 ws://127.0.0.1:5000/info这个接口接口是否正常。
在下面的代码中我们定义了三个方法
on_message方法:专门用来监听和处理返回的数据(这边只是打印了一下,没有做特别的处理)
on_error方法:专门用来监听是否出现错误(这边只是打印了一下错误,没有做特别的处理)
on_close方法:用来监听连接是否关闭,当连接关闭时,则会调用该方法
import websocket
# 定义一个用来接收监听数据的方法
def on_message(ws, message):
print("监听到服务器返回的消息,内容如下:")
print(message)
# 定义一个用来处理错误的方法
def on_error(ws, error):
print("-----连接出现异常,异常信息如下-----")
print(error)
# 定义一个用来处理关闭连接的方法
def on_close(ws):
print("-------连接已关闭------")
if __name__ == "__main__":
ws = websocket.WebSocketApp("ws://127.0.0.1:5000/info",
on_message=on_message,
on_error=on_error,
on_close=on_close,
)
ws.run_forever()
关于websocket-client的基本使用就给大家介绍到这里,大家有兴趣可以自己去扩展研究。
自动化测试案例
接下来给大家分享一下如何通过unittest去编写websocket的接口用例。下面是我自己写的一个websocket的接口
接口说明
投票接口
接口地址:ws://127.0.0.1:5000/vote
请求协议:websocket
请求参数:
返回结果(json):
用例代码
import json
import unittest
from websocket import create_connection
import websocket
class TestVote(unittest.TestCase):
url = 'ws://127.0.0.1:5000/vote'
@classmethod
def setUpClass(cls):
# 前置方法
websocket.enableTrace(True) # 打开跟踪,查看日志
cls.ws = create_connection(cls.url) # 创建连接
cls.ws.settimeout(10) # 设置超时时间
def test_connect_status(self):
"""测试连接状态"""
# 断言连接状态
self.assertEqual(101, self.ws.getstatus())
def test_send_info(self):
# 第一步:准备参数
params = {'id': 1}
expected = {'status': "success"}
# 第二步:发送请求
self.ws.send(json.dumps(params))
# 获取结果
result = self.ws.recv()
res = json.loads(result)
# 第三步:断言:
print("接收结果:", res)
self.assertEqual(expected['status'], res['status'])
@classmethod
def tearDownClass(cls):
cls.ws.close()
if __name__ == '__main__':
unittest.main()
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
不要因为现在的困难而放弃,因为只有坚持到最后,才会看到成功的曙光。相信自己,不断前行,你一定能够突破自我,实现更大的梦想。
只有不断努力和坚持,才能在未来的路上走得更远,实现自己的人生价值。所以,不要轻言放弃,保持勇气和信心,一步步向前迈进!
生命中最重要的不是你遭遇了什么,而是你学会了什么。只有在不断奋斗和经历中,才能成长为更好的自己,实现自己的人生价值。