1步测试Thrift接口——2步测试Thrift接口(续)

一个基于thriftpy的Python thrift client。

题图:from Zoommy

1.引言

还记得之前写过的一个“2步测试Thrift接口”

彼时还需要2步

  1. shell脚本生成python
  2. python调用server

由于发现了thriftpy,如今已经精简到只需要1步啦,通用的python脚本,一条命令搞定Thrift接口测试!

2.Thriftpy

thriftpy是饿了么开源的thrift协议的纯Python实现,本文中比较看重的特点是其无需根据thrift文件生成目标代码,可以直接读取thrift文件对thrift接口发起调用。

相关文档可以参见:https://thriftpy.readthedocs.io/en/latest/

3.Python thrift client

让我们直奔主题,如何使用这个python client。

3.1 所需依赖以及安装

3.1.1 Python3

1
brew install python3

注:homebrew安装:https://brew.sh/

3.1.2 Pip3(python包管理)

Mac如何安装pip:https://pip.readthedocs.io/en/stable/installing/

下载好上面链接中的get-pip.py,执行命令:

1
python3 get-pip.py

3.1.3 thriftpy与jsonpickle

1
pip3 install cython thriftpy jsonpickle

3.2 client

3.2.1 使用方法

  1. 将脚本放在Thrift定义文件夹下
  2. 使用以下脚本,直接在命令中指定ip、端口、方法所在thrift文件名、方法所在service名、方法名及参数列表,即可完成调用。(脚本中有示例命令)

3.2.2 脚本源码

client.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# -*- coding: utf-8 -*-
# notes:
# thrift文件中不能包含from、include等与关键字冲突的变量名
# example:
# python3 client.py 10.20.112.128 9100 ./service.thrift CustomerThriftService 'createCustomer(16761,"15600995400",0)'
# python3 client.py 10.20.123.134 9100 ./service.thrift CustomerThriftService 'getCustomerIds(tModule["./Model.thrift"].CustomerQueryReq(tenantId=16817,customerIds=[6200992795649180673]))'
import jsonpickle
import thriftpy
import os
import sys
from thriftpy.rpc import make_client
from thriftpy.protocol.binary import TBinaryProtocolFactory
from thriftpy.transport.framed import TFramedTransportFactory
tModule = {}
basePath = "."
def test(param1, param2, param3, param4, param5):
load(basePath)
print("=============")
print("加载的模块: ")
print(tModule)
print("=============")
client = make_client(service=eval("tModule['" + param3 + "']" + "." + param4), host=param1, port=int(param2), timeout=9999, proto_factory=TBinaryProtocolFactory(), trans_factory=TFramedTransportFactory())
print("返回的结果: ")
print(jsonpickle.encode(eval("client." + param5)))
print("=============")
# 加载client.py所在目录及子目录下的所有thrift文件,
def load(basePath):
paths = os.listdir(basePath)
for path in paths:
bp = basePath + "/" + path
if os.path.isfile(bp) and path.endswith(".thrift"):
tModule[bp] = thriftpy.load(bp)
elif os.path.isdir(bp):
load(bp)
if __name__ == '__main__':
test(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])

3.2.3 使用示例

1
2
3
4
# example:
# python3 client.py server端ip server端口 方法所在thrift文件名 方法所在service名 字符串形式的方法名及参数列表
# python3 client.py 10.20.112.128 9100 ./service.thrift CustomerThriftService 'createCustomer(16761,"15600995400",0)'
# python3 client.py 10.20.123.134 9100 ./service.thrift CustomerThriftService 'getCustomerIds(tModule["./Model.thrift"].CustomerQueryReq(tenantId=16817,customerIds=[6200992795649180673]))'