测试socket接口
测试socket接口
接口测试时,除了常见的http接口,还有一种比较多见,就是socket接口,今天讲解下怎么用Python自带的socket库进行socket接口测试。
我们就用之前搭建的测试框架来实现。具体可见 从零搭建自动化测试框架系列
1. socket接口
socket
又叫 套接字
,可以理解为是一个应用程序的地址,是实现网络通信的关键。我们可以通过IP找到一台主机,可以通过主机的端口找到该主机上的某个应用程序。
这样,就可以通过socket进行两个应用程序之间的通信。具体实现就是在一端实现一个一直在监听的server,另一端向其发送请求,并获取响应。server对不同的请求进行不同的处理并返回,这就是socket接口。
下面我们就实现一个socket的接口并对其进行测试。
2. 实现一个socket server接口
在test下创建mock文件夹,并在其中创建mock_socket_server.py文件:
"""
socket server 的mock。
两个接口,add和sub
接收:
{"action": "add","params": {"a": 1, "b": 2}
}
返回:
{"action": "add","result": 3
}
"""
import socket
import jsondef add(a, b):return a + bip_port = ('127.0.0.1', 8080)
server = socket.socket()
server.bind(ip_port)
server.listen(5)while True:conn, addr = server.accept()data = conn.recv(1024)try:ddata = json.loads(data)action = ddata.get('action')params = ddata.get('params')if action == 'add':res = add(**params)conn.send(b'{"action": "add", "result": %d}' % res)else:conn.send(b'{"code":-2, "message":"Wrong Action"}')except (AttributeError, ValueError):conn.send(b'{"code":-1, "message":"Data Error"}')finally:conn.close()
我们就实现了一个简单的socket server,有一个接口add。开发给你的接口文档可能是这样的:
接口类型: socket
接口地址: 127.0.0.1
端口: 8080
接口名称: 加法
action name: add
入参:
名称 类型 是否必须 a int 是 b int 是 出参:
名称 类型 含义 result int 结果 入参示例:
{"action": "add","params": {"a": 1, "b": 2}}
出参示例:
{"action": "add","result": 3 }
error code:
code message -1 Data Error -2 Wrong Action
拿到接口文档,接下来我们该怎么进行测试呢?
3. 测试socket接口
首先我们需要一个通用的client类,把socket接口测试通用的方法封装起来,免得每次都得写一堆。在client.py中添加TCPClient
class TCPClient(object):"""用于测试socket请求"""def __init__(self, domain, port, timeout=30, max_receive=102400):self.domain = domainself.port = portself.connected = 0 # 连接后置为1self.max_receive = max_receiveself._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self._sock.settimeout(timeout)def connect(self):"""连接指定IP、端口"""if not self.connected:try:self._sock.connect((self.domain, self.port))except socket.error as e:logger.exception(e)else:self.connected = 1logger.debug('TCPClient connect to {0}:{1} success.'.format(self.domain, self.port))def send(self, data, dtype='str', suffix=''):"""向服务器端发送send_string,并返回信息,若报错,则返回None"""if dtype == 'json':send_string = json.dumps(data) + suffixelse:send_string = data + suffixself.connect()if self.connected:try:self._sock.send(send_string.encode())logger.debug('TCPClient Send {0}'.format(send_string))except socket.error as e:logger.exception(e)try:rec = self._sock.recv(self.max_receive).decode()if suffix:rec = rec[:-len(suffix)]logger.debug('TCPClient received {0}'.format(rec))return recexcept socket.error as e:logger.exception(e)def close(self):"""关闭连接"""if self.connected:self._sock.close()logger.debug('TCPClient closed.')
然后在config.yml中添加socket的接口的基本配置:
ip: 127.0.0.1
port: 8080
然后在interface中创建我们的测试test_socket.py
import unittest
from utils.client import TCPClient
from utils.config import Config
from utils.extractor import JMESPathExtractorje = JMESPathExtractor()class TestAdd(unittest.TestCase):def setUp(self):c = Config()ip = c.get('ip')port = c.get('port')self.client = TCPClient(ip, port)def tearDown(self):self.client.close()def test_add(self):data = {'action': 'add','params': {'a': 1, 'b': 2}}res = self.client.send(data, dtype='json')self.assertEqual(je.extract('result', res), 3)self.assertEqual(je.extract('action', res), 'add')def test_wrong_action(self):data = {'action': 'sub','params': {'a': 1, 'b': 2}}res = self.client.send(data, dtype='json')self.assertEqual(je.extract('code', res), -2)self.assertEqual(je.extract('message', res), 'Wrong Action')def test_wrong_data(self):data = 'xxxxx'res = self.client.send(data)self.assertEqual(je.extract('code', res), -1)self.assertEqual(je.extract('message', res), 'Data Error')if __name__ == '__main__':unittest.main(verbosity=2)
简单的测试用例完成了,执行下(先把mock server跑起来哟):
test_add (__main__.TestAdd) ... ok
test_wrong_action (__main__.TestAdd) ... ok
test_wrong_data (__main__.TestAdd) ... ok----------------------------------------------------------------------
Ran 3 tests in 0.009sOK
当然,接口不可能这么简单,用例也不可能就这几个,这里只是简单举个栗子,会应用了,再复杂的socket接口都是一个样子。
这里我们用了自己mock的server,当开发真正的接口通了之后,改改config.yml中的ip和port,就可以直接执行测试了。
测试socket接口相关推荐
- 巧用 Curl 命令测试 Unix Socket 接口
公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 经常遇到一些监听地址不是 IP:Port 而是 Unix Socket 的程序,这些程序如果使用的是 HTTP 协 ...
- jmeter 测试websocket接口(一)
jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...
- 使用JMeter测试WebSocket接口
因为我之前对WebSocket接口也不是很了解,所以本篇文章先简单的概括的说明一下WebSocket的相关概念.在文章的后半部分,进行测试WebSocket接口的步骤说明. 1.什么是WebSocke ...
- linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...
陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...
- 【接口测试】JMeter测试WebSocket接口
目录 一.WebSocket简介 二.JMeter测试WebSocket接口 三.WebSocket和Socket的区别 最近老被问到WebSocket,突然想到以前大学时上Java课的时候,老师教我 ...
- Socket接口原理及用C#语言实现
首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...
- C语言socket connect()函数(初始化套接字上的连接)(未完)(如何测试socket是否已经断开,如何判断socket是否断开)
参考文章:C网络编程socket之connect函数 需研究下这个函数超时多久才返回... 文章目录 项目中注释解释 man 2 文档解释 关于上面man 2 手册中所提到的connect()案例,在 ...
- 关于python测试webservice接口的视频分享
现在大公司非常流行用python做产品的测试框架,还有对于一些快速原型产品的开发也好,很好地支持OO编程,代码易读. Python的更新挺快的,尤其是第三方库. 对于测试人员,代码基础薄弱,用pyth ...
- react jest测试_如何使用Jest和react-testing-library测试Socket.io-client应用程序
react jest测试 by Justice Mba 由Mba法官 如何使用Jest和react-testing-library测试Socket.io-client应用程序 (How to test ...
最新文章
- java调用可执行文件
- docker中lnmp访问php页面,Docker下部署LNMP工作环境的教程(详细步骤)
- 视频云的全景蓝图,想象力的允诺之地
- activepython win32com_activepython下载
- Python3解决UnicodeDecodeError:'utf-8' codec can't decode byte..问题终极解决方案
- Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)
- 前端学习(911):PC端网页特效
- Java并发编程实战~并发容器
- Android 如何让EditText不自动获取焦点
- C语言——猴子吃桃问题
- There is 和 There are的使用_28
- 操作 Wave 文件(3): 接触 mmio 系列函数
- 开发LED屏幕页面遇到的问题
- 平时碰到系统CPU飙高和频繁GC,你会怎么排查?
- gitlab提交代码
- serv u使用mysql数据库_Serv-u Mysql数据库用户
- cass转换jpg_【转】南方CASS作原有地形图数字化--对扫描栅格图像进行校正及矢量化...
- VMware的XP虚拟机联网
- 8小时 用kotlin开发一款app
- 微信小程序可以打开公众号文章