用Python进行websocket接口测试

我们在做接口测试时,除了常见的http接口,还有一种比较多见,就是socket接口,今天讲解下怎么用Python进行websocket接口测试。

webscoket的属性、方法和事件

python socket断开连接发送好多 python socket长连接_python


需要准备的测试环境

安装python,版本3.0以上

安装IDE,pycharm等

安装websocket、websocket-client 包

3、websocket接口测试前,把需要支持的安装包都安装好

pip install websocket-client

pip install websockets


安装完之后,我们就开始我们的websocket之旅了。

先举个简单的例子:

import websocket
ws = websocket.WebSocket()
ws.connect("ws://example.com/websocket", 
      http_proxy_host="proxy_host_name", 
      http_proxy_port=3128)

这个栗子就是创建一个websocket连接,这个模块支持通过http代理访问websocket。代理服务器允许使用connect方法连接到websocket端口。默认的squid设置是“只允许连接HTTPS端口”。

在websocket里,我们有常用的这几个方法:
on_message方法:

def on_message(ws, message):
  print(message)

on_message是用来接受消息的,server发送的所有消息都可以用on_message这个方法来收取。
on_error方法:

def on_error(ws, error):
  print(error)

这个方法是用来处理错误异常的,如果一旦socket的程序出现了通信的问题,就可以被这个方法捕捉到。
on_open方法:

def on_open(ws):
  def run(*args):
    for i in range(30):
      # send the message, then wait
      # so thread doesn't exit and socket
      # isn't closed
      ws.send("Hello %d" % i)
      time.sleep(1)
 
    time.sleep(1)
    ws.close()
    print("Thread terminating...")
 
  Thread(target=run).start()

on_open方法是用来保持连接的,上面这样的一个例子,就是保持连接的一个过程,每隔一段时间就会来做一件事,他会在30s内一直发送hello。最后停止。

on_close方法:

def on_close(ws):
  print("### closed ###")

onclose主要就是关闭socket连接的。

如何创建一个websocket应用:

ws = websocket.WebSocketApp("wss://echo.websocket.org")

括号里面就是你要连接的socket的地址,在WebSocketApp这个实例化的方法里面还可以有其他参数,这些参数就是我们刚刚介绍的这些方法。

ws = websocket.WebSocketApp("ws://echo.websocket.org/",
              on_message=on_message,
              on_error=on_error,
              on_close=on_close)

指定了这些参数之后就可以直接进行调用了,例如:

ws.on_open = on_open

这样就是调用了on_open方法
如果我们想让我们的socket保持长连接,一直连接着,就可以使用run_forever方法:

ws.run_forever()

综上所述,完整的应该这么写:

import websocket
from threading import Thread
import time
import sys
 
def on_message(ws, message):
  print(message)
 
def on_error(ws, error):
  print(error)
 
def on_close(ws):
  print("### closed ###")
 
def on_open(ws):
  def run(*args):
    for i in range(3):
      # send the message, then wait
      # so thread doesn't exit and socket
      # isn't closed
      ws.send("Hello %d" % i)
      time.sleep(1)
 
    time.sleep(1)
    ws.close()
    print("Thread terminating...")
 
  Thread(target=run).start()
 
 
if __name__ == "__main__":
 
  websocket.enableTrace(True)
  host = "ws://echo.websocket.org/"
  ws = websocket.WebSocketApp(host,
                on_message=on_message,
                on_error=on_error,
                on_close=on_close)
  ws.on_open = on_open
  ws.run_forever()

如果想要通信一条短消息,并在完成后立即断开连接,我们可以使用短连接:

from websocket import create_connection
ws = create_connection("ws://echo.websocket.org/")
print("Sending 'Hello, World'...")
ws.send("Hello, World")
print("Sent")
print("Receiving...")
result = ws.recv()
print("Received '%s'" % result)
ws.close()

这里更新一下,对于websocket 发送如果我们直接发送,很可能因为格式不正确,服务端不能解析,这时可以考虑,导入json包
对 发送的数据进行解析,注意把代码放在对应的位置上。

import json

Data={"channel": "xxx", "market": 'xxx', "event": "xxxx"}

 ws.send(json.dumps(Data).encode('utf8'))

json dump编码loads 解码,或者说反序列化比较好,dumps是把python中的数据对象,序列化成json格式的字符串;
loads是把json格式的字符串反序列化为python中的数据对象
obj = json.loads(response.content.decode(‘utf8’))#据说是终极方法,获取内容自己解码,通常情况下,响应消息体是json格式都需要转换为python中的数据对象
print(obj)
print(obj[‘form’])#如果不处理,取数据是很麻烦的
print(obj[‘form’][‘2’])