测试完全陌生的协议 - 图1

一、未知新协议接口

接口在网络中传输数据需要遵循一种协议完成,除了主流的http协议之外,常见的还有websocket、dubbo等协议接口。

1、websocket

http协议中需要客户端发起请求服务端返回响应结果,而对于服务器会有连续状态的变更(如聊天室功能),无法主动推送给客户端,只能通过轮询的方式,每隔一段时间发起请求查询,造成效率低下,资源浪费。
websocket是一种网络通信协议,它最大的特点就是服务器可以主动向客户端推送信息,属于服务器推送技术的一种,可以弥补http通信只能由客户端发起的缺陷。 http://www.ruanyifeng.com/blog/2017/05/websocket.html

2、dubbo

Dubbo是阿里巴巴公司开源的一个高性能服务框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
当系统中应用被独立拆分的越来越多则无法避免应用之间的交互,因此将核心业务抽取出来作为单独的服务,如订单服务、交易服务、支付服务等,逐渐形成稳定的服务中心,服务层负责业务逻辑的处理对外提供,表现层则只需要处理和页面的交互。
https://blog.csdn.net/weixin_43326401/article/details/104365127
https://blog.csdn.net/cyjs1988/article/details/82495136

  • dubbo架构图

image.png

  • 调用关系说明
    1. 服务容器负责启动,加载,运行服务提供者。
    2. 服务提供者在启动时,向注册中心注册自己提供的服务。
    3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
    4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

二、陌生协议接口测试思路

项目迭代速度快,测试时间紧迫的情况下面对陌生协议接口,如果还是大量的学习新协议的内容,阅读开发代码,无疑是压缩测试工期,也使得测试工作真正开展的时候手忙脚乱,因此需要重点关注接口的响应能否满足需求。
1、简单了解相关协议框架的定义,核心功能,优势等。
2、重点关注该协议下的接口正常请求的响应数据、非法请求下的响应数据,以及如何快速掌握验证方式。

三、如何快速测试

1、借力开发,询问开发工程师接口的调用方式,拿到开发提供的客户端调用代码,因为他已经基于新的协议完成了接口的开发。
2、运用charles等代理工具截获接口,分析数据请求与响应
3、运用技术栈自己写测试代码
3.1 Python 支持websocket:
https://segmentfault.com/q/1010000009284816?_ea=1883181

  1. #引入websocket的create_connection类
  2. from websocket import create_connection
  3. # 建立和WebSocket接口的链接
  4. ws = create_connection("ws://echo.websocket.org")
  5. # 打印日子
  6. print("发送 'Hello, World'...")
  7. # 发送请求数据
  8. ws.send("Hello, World")
  9. # 将WebSocket的返回值存储result变量
  10. result = ws.recv()
  11. # 打印返回的result
  12. print("返回"+result)
  13. # 关闭WebSocket链接
  14. ws.close()

合并至框架中新增代码:
image.png
3.2 Python 支持dubbo协议:
https://dubbo.apache.org/zh/docs/v2.7/user/quick-start/
https://www.cnblogs.com/suger43894/p/9372123.html

  • dubbo可支持命令telnet调用:

https://www.cnblogs.com/suger43894/p/9372123.html
封装dubbo_telnet命令:https://www.cnblogs.com/nuonuozhou/p/10300394.html

  • 安装telnet命令,与curl命令类似支持远程访问。

image.png
image.png

image.png
image.png

  1. > telnet 10.9.48.115 28899
  2. > invoke com.xxx.bluespar.star.service.BudgetService.recBudgetDetail({"budgetId":"HKYF201908000003","businessNo":"BN201908000003","sendDate":"2019-08-24 10:42:20","bill":"测试001","secondBill":"测试001_second","transName":"测试transName","startCustomerId":"982","startCustomerName":"苏州","startCityId":"320500","startCityName":"苏州","startAirportName":"无锡","endCustomerId":"522","endCustomerName":"金华","endCityId":"330700","endCityName":"金华","endAirportName":"广州","flightType":1,"flightNo":"GZ568888","secFlightNo":"GZ568888_001","pickLocationName":"广州","goodsTypeName":"广州","sendBillCount":200,"sendGrossWeight":8935.66,"sendCalWeight":8955.55,"pickBillCount":1122.66,"pickGrossWeight":898.66,"pickCalWeight":55.88,"computeWeight":223.33,"financeReviewWeight":88.66,"reviewWeight":120.33,"computeModeName":"结算","settleModeName":"结算","computePrice":55.2,"feeKindsName":"费用类型名","feeValue":500.2,"settleInCustId":"982","settleInCustName":"苏州","settleOutCustId":"522","settleOutCustName":"金华","remark":"备注一下"})

3.2.1 转成http调用方式

  1. curl -d 'refundPaymentOrderRequest={'outRequestNo': 'test2020032472995', 'paymentOrderNo': '20200602152950973663535723', 'refundAmt': '2', 'callbackUrl': '' "}' -H "Content-Type: application/json" -H '_method_name: pay' -H '_dubbo_token: hello_souche_token' -X POST '10.0.0.0:0/com.souche.x.x.x.x'