测试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接口相关推荐

  1. 巧用 Curl 命令测试 Unix Socket 接口

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 经常遇到一些监听地址不是 IP:Port 而是 Unix Socket 的程序,这些程序如果使用的是 HTTP 协 ...

  2. jmeter 测试websocket接口(一)

    jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...

  3. 使用JMeter测试WebSocket接口

    因为我之前对WebSocket接口也不是很了解,所以本篇文章先简单的概括的说明一下WebSocket的相关概念.在文章的后半部分,进行测试WebSocket接口的步骤说明. 1.什么是WebSocke ...

  4. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

    陈洁 孟晓景 摘要:为了实现Linux与Windows跨平台通信,及时共享信息,构建了一个适用于跨平台的网络聊天室通信程序.先搭建跨平台通信环境,然后使用Socket套接字网络编程接口实现通信.整个系 ...

  5. 【接口测试】JMeter测试WebSocket接口

    目录 一.WebSocket简介 二.JMeter测试WebSocket接口 三.WebSocket和Socket的区别 最近老被问到WebSocket,突然想到以前大学时上Java课的时候,老师教我 ...

  6. Socket接口原理及用C#语言实现

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...

  7. C语言socket connect()函数(初始化套接字上的连接)(未完)(如何测试socket是否已经断开,如何判断socket是否断开)

    参考文章:C网络编程socket之connect函数 需研究下这个函数超时多久才返回... 文章目录 项目中注释解释 man 2 文档解释 关于上面man 2 手册中所提到的connect()案例,在 ...

  8. 关于python测试webservice接口的视频分享

    现在大公司非常流行用python做产品的测试框架,还有对于一些快速原型产品的开发也好,很好地支持OO编程,代码易读. Python的更新挺快的,尤其是第三方库. 对于测试人员,代码基础薄弱,用pyth ...

  9. 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 ...

最新文章

  1. java调用可执行文件
  2. docker中lnmp访问php页面,Docker下部署LNMP工作环境的教程(详细步骤)
  3. 视频云的全景蓝图,想象力的允诺之地
  4. activepython win32com_activepython下载
  5. Python3解决UnicodeDecodeError:'utf-8' codec can't decode byte..问题终极解决方案
  6. Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)
  7. 前端学习(911):PC端网页特效
  8. Java并发编程实战~并发容器
  9. Android 如何让EditText不自动获取焦点
  10. C语言——猴子吃桃问题
  11. There is 和 There are的使用_28
  12. 操作 Wave 文件(3): 接触 mmio 系列函数
  13. 开发LED屏幕页面遇到的问题
  14. 平时碰到系统CPU飙高和频繁GC,你会怎么排查?
  15. gitlab提交代码
  16. serv u使用mysql数据库_Serv-u Mysql数据库用户
  17. cass转换jpg_【转】南方CASS作原有地形图数字化--对扫描栅格图像进行校正及矢量化...
  18. VMware的XP虚拟机联网
  19. 8小时 用kotlin开发一款app
  20. 微信小程序可以打开公众号文章

热门文章

  1. 在干扰和箔条环境中的雷达方程
  2. 手机适配之 dimen 基础知识
  3. 全国计算机python二级2019.12报名_2019年12月全国计算机等级报名入口
  4. Kotlin柯里化——函数调用链
  5. CentOS中yum安装软件时报错:No package XXX available(转载)
  6. 数据库字段与Java属性映射关系
  7. php 求子串,字符串的连接与求子串,目测只有高手可以帮我解答了
  8. 《庄子·杂篇·则阳第二十五》
  9. 项目pom.xml文件中间有一横杠解决方法
  10. 纯 js 实现上传文件支持拖拽