Thrift是Facebook实现的一种高效的并且支持多种主流编程语言的远程服务调用的框架,Thrift服务器包含了用于绑定协议和传输层的基础架构,也是基于HTTP/2.0的版本实现,Thrift提供阻塞,非阻塞,单线程,多线程的模式运行在服务器上,结合容器化技术可以实现无缝的对接。
在使用Thrift之前,首先需要搭建Thrift的环境,在Mac中,搭建环境成功后,输入命令:thrift -v就会显示具体的版本号信息,具体如下图所示。
thrift -version
Thrift version 0.11.0
搭建环境成功后,下面通过具体的案例来演示下这部分的具体实战应用。
首先需要编写thrift的文件,如按文件名称为login.thrift,案例中的文件信息如下:
service Login {
string sayMsg(1:string msg);
string invoke(1:i32 status 2:string token 3:bool isActive 4:string data)
}
在Login中定义了sayMsg和invoke,下来执行命令生成对应的Python文件,在
login.thrift的目录下,执行如下命令:
thrift -gen py login.thrift
执行成功后,会在gen_py的包下生成login的包,具体结构如下所示:
下来把login的包移动到项目的根目录下,要不无法调用,移动后的目录结构如下所示:
下来编写端的代码,源代码具体如下:
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:无涯
import json
from login import Login
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
class LoginThrift(object):
def __init__(self):
pass
def sayMsg(self,msg):
'''获取到来自客户端的请求信息'''
return json.dumps({'msg':msg})
def invoke(self,status,token,isActive,data):
if status==0:
return json.dumps({'status':status,'token':token,'isActive':isActive,'data':json.loads(data)})
else:
return '请求参数错误,请检查!'
if __name__ == '__main__':
handler=LoginThrift()
processor=Login.Processor(handler)
transport=TSocket.TServerSocket('127.0.0.1',12305)
tfactory=TTransport.TBufferedTransportFactory()
pfactory=TBinaryProtocol.TBinaryProtocolFactory()
server=TServer.TSimpleServer(processor,transport,tfactory,pfactory)
print('Starting server...')
server.serve()
?编写好服务端的代码后,开始编写客户端的代码,也就是具体的API测试用例,这地方主要测试对应的接口信息以及验证服务端返回的响应数据,测试代码如下:
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:无涯
import json
import uuid
from login import Login
from login.ttypes import *
from login.constants import *
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
def conn_thrift():
transport = TSocket.TSocket('127.0.0.1', 12305)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = Login.Client(protocol)
transport.open()
return transport,client
def test_thrift_login_invoke():
transport,client=conn_thrift()
status=0
token=str(uuid.uuid4())
isActive=True
data=json.dumps({"name":"wuya"})
data=json.loads(client.invoke(status=status,token=token,isActive=isActive,data=data))
assert data['status']==0
assert data['data']=={'name': 'wuya'}
transport.close()
def test_thrift_login_sayMsg():
transport,client=conn_thrift()
msg='Hello Thrift'
msg=json.loads(client.sayMsg(msg=msg))
assert msg['msg']=='Hello Thrift'
transport.close()
?在如上代码中,对返回来的响应数据进行了反序列化的处理以及响应数据的验证。其实在之前的文章学习的成本中很详细的介绍到针对不同的协议的测试,本质的核心思想都是一样的,都是客户端与服务端之间的请求/响应模式或者是异步通信的模式。所以遇到gRPC协议还是Thrift其实看看官方的资料,就能够立刻的编写出API的测试用例。
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
???视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。?????