【摘要】 首先明确 Tcp 的概念,针对 Tcp 协议进行接口测试,是指基于 Tcp 协议的上层协议比如 Http ,串口,网口, Socket 等。这些协议与 Http 测试方法类似(具体查看接口自动化测试章节),但在测试过程中需要做些调整。SocketSocket 又称套接字,进程可通过套接字进行网络通信,使多个设备具有交互能力。Socket 适合对传输速度和安全性有严格要求的应用,比如手机内核与...
首先明确 Tcp 的概念,针对 Tcp 协议进行接口测试,是指基于 Tcp 协议的上层协议比如 Http ,串口,网口, Socket 等。这些协议与 Http 测试方法类似(具体查看接口自动化测试章节),但在测试过程中需要做些调整。
Socket
Socket 又称套接字,进程可通过套接字进行网络通信,使多个设备具有交互能力。Socket 适合对传输速度和安全性有严格要求的应用,比如手机内核与外界进行测试数据的传输。支持 Socket 设备不止计算机,还会有移动端,如果测试 Socket 协议,需要有收发 Socket 数据的能力或代理 Socket 的能力。
下图展示了正常的 Socket 通信流程:
1080×234 18.6 KB
如果测试 Socket 协议,需要做以下改造,即利用 Socket 代理,进行 Socket 数据的接收:
1080×201 22 KB
需要特别注意,需要应用可更改 Socket 地址,才可使用代理。以 Python 的 Socket 为例,下面是一个简单的 Socket 客户端和服务端:
# 客户端
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = '127.0.0.1' # 获取本地主机名
port = 12345 # 设置端口号
s.connect((host, port))
print(s.recv(1024).decode())
s.close()
# 服务端
import socket # 导入 socket 模块
s = socket.socket() # 创建 socket 对象
host = '127.0.0.1' # 获取本地主机名
port = 12345 # 设置端口
s.bind((host, port)) # 绑定端口
s.listen(5) # 等待客户端连接
while True:
c,addr = s.accept() # 建立客户端连接
print(addr)
c.send('收到信息'.encode())
c.close() # 关闭连接
客户端可与服务端进行交流,但 Socket 地址不可更改,即上述客户端代码的 127.0.0.1 和 12345 端口不能通过配置文件进行更改。如果不能更改这两者,就堵死了通向代理的道路:
1080×218 25 KB
如何进行修改?以客户端代码为例,可通过配置文件来配置 host 和 port :
import socket
import yaml
# 通过配置文件,进行 host 和 port 配置
with open("config.yaml","r", encoding="utf-8") as f:
data = yaml.safe_load(f)
host = data.get("host")
port = data.get("port")
s = socket.socket()
s.connect((host, port))
print(s.recv(1024).decode())
s.close()
config.yaml 的内容如下:
host: "127.0.0.1"
port: 12345
上述更改,可使应用走 Socket 代理。测试人员还需一款合适的代理工具,推荐 mitmproxy 或自写 Socket 代理。mitmproxy 使用请参考:
mitmproxy 官网:https://www.mitmproxy.org/ 1
其他协议
其它协议,比如串口、网口、visa 等,与 Socket 的测试模式类似,用相同的图即可简述:
1080×199 22.5 KB
其它协议较 Sokcet 更冷门,无合适的代理工具。需要测试人员自己写代理,比如串口协议, Python 虽然支持 Pyserial 进行收发串口,但无代理。此时需要测试人员自行编写串口代理工具。这个过程需要开启两个监听服务,如下图,监听服务 A 监听端口 123 ,如果有数据进来,会透传(或做数据更改,实现 mock)给端口 456,监听服务 B 同理:
1080×628 47.6 KB
使用两个监听服务,可编写任意协议,但注意缺点,数据的传输时间会增加,如果过分注重性能,此方案慎用。下面是参考代码,其中只保留了关键逻辑:
def forward(self):
"""
开启监听
:return:
"""
while True:
# 从虚拟串口接收到请求
virtual_req = self.virtual_ser.recv()
if b'' == virtual_req:
continue
if self.is_call_back:
# 返回空值,让 mock_server 决定返回内容
real_result = b""
else:
# 等待真实设备出现
if self.real_ser is None :
# 代码省略
# 将请求转发到真实串口
real_result = self.real_ser.write_by_bytes(virtual_req)
# 获取 mock 的结果,在此可以加入 mock 操作
mock_result = self.mock_server.mock(virtual_req, real_result)
# 将 mock 结果写入虚拟串口
self.virtual_ser.send(mock_result)
再次强调,需要让应用支持端口修改,才能使用代理工具,这部分需要与开发交流,提修改需求。