软件测试 | Tcp协议的接口测试

tcp 协议的接口测试

首先明确 Tcp 的概念,针对 Tcp 协议进行接口测试,是指基于 Tcp 协议的上层协议比如 Http ,串 口,网口, Socket 等。这些协议与 Http 测试方法类似(具体查看接口自动化测试章节),但在测试过 程中需要做些调整。

Socket

Socket 又称套接字,进程可通过套接字进行网络通信,使多个设备具有交互能力。Socket 适合对传输速 度和安全性有严格要求的应用,比如手机内核与外界进行测试数据的传输。支持 Socket 设备不止计算 机,还会有移动端,如果测试 Socket 协议,需要有收发 Socket 数据的能力或代理 Socket 的能力。下 图展示了正常的 Socket 通信流程:

如果测试 Socket 协议,需要做以下改造,即利用 Socket 代理,进行 Socket 数据的接收:

需要特别注意,需要应用可更改 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 端口不能通过配置文件进行更改。如果不能更改这两者,就堵死了通向代理的道路:

如何进行修改?以客户端代码为例,可通过配置文件来配置 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/

其它协议

其它协议,比如串口、网口、visa等,与Socket的测试模式类似,用相同的图即可简述:

再次强调,需要让应用支持端口修改,才能使用代理工具,这部分需要与开发交流,提修改需求。其它 协议较 Sokcet 更冷门,无合适的代理工具。需要测试人员自己写代理,比如串口协议, Python 虽然支 持 Pyserial 进行收发串口,但无代理。此时需要测试人员自行编写串口代理工具。这个过程需要开启两 个监听服务,如下图,监听服务 A 监听端口 123 ,如果有数据进来,会透传(或做数据更改,实现 mock)给端口 456,监听服务 B 同理:

使用两个监听服务,可编写任意协议,但注意缺点,数据的传输时间会增加,如果过分注重性能,此方 案慎用。下面是参考代码,其中只保留了关键逻辑:

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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值