一、目的
尝试利用python实现简单的web接口测试,其中接口的相关信息保存在excel文件中。
二、约定的接口信息格式
接口信息利用excel文件保存,其格式信息如下
接口名称 | 接口标识 | 接口地址 | 请求方法 | 必传参数 | 可选参数 |
登录接口 | logininterface | v1/web/message/view/unread | POST | 测试1=参数1 测试2=参数2 测试3=参数3 |
三、主要类和方法
1.接口信息数据类
主要功能:打开存有接口信息的excel文件并读取数据,进行简单的数据处理
#接口信息数据类
class InterfaceData(object):
#类初始化
def __init__(self,filename):
if os.path.exists(filename):
self.filename=filename
else:
print("未找到文件%s,请检查文件名称是否正确!"%filename)
def open_file(self):
interfaceExcel=xlrd.open_workbook(self.filename)
print(interfaceExcel)
# 参数数据获取
def params_fetch(self,name,paramsStr):
paramsList=paramsStr.split('\n')
print(paramsList)
paramsNum=len(paramsList)
paramsDict={}
for i in range(paramsNum):
temp=paramsList[i]
param=temp.split('=')
if len(param)==2:
paramsDict[param[0]]=param[1]
else:
raise Exception("%s接口中参数格式有误"%name)
print(paramsDict)
return paramsDict
#excel数据处理
def data_fetch(self):
interfaceExcel = xlrd.open_workbook(self.filename)
#table=interfaceExcel.sheets()[0]
table=interfaceExcel.sheet_by_index(0)
rowNum=table.nrows
colNum=table.ncols
interfaceDict={} #接口字典
try:
if rowNum <= 1:
print("文件中未找到有效数据")
else:
print("文件中获取到%d条数据"%(rowNum-1))
for i in range(rowNum-1):
if i == 0:
sheetHead=table.row_values(0)
print(sheetHead)
else:
temp={}
for j in range(colNum):
temp[sheetHead[j]]=table.row_values(i)[j]
print(temp)
interfaceDict[temp["接口名称"]]=temp
print(interfaceDict)
except:
print("出现未知错误,请重新处理数据")
return interfaceDict
2.登录类,获取token或其他参数
对于web网站,身份验证可能需要token值,因此在做接口测试前,需要执行登录接口,获取token值方便后续测试
#登录类,获取token和jtoken
class Login(object):
#基本公共参数
basicArg = {
'xxx': xxx,
'xxx': 'xxx'
}
#基本请求头参数
headers = {
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': '321',
'Host': 'xx.xx.xx.xx:8086',
'User-Agent': 'Apache-HttpClient/4.5.2 (Java/1.8.0_171)'
}
#类初始化
def __init__(self,ip,port,account,password):
#数据赋值
self.ip = ip
self.port = port
self.account = account
self.password=password
#获取token
def get_token(self):
#登录接口地址
loginPath='xxxx'
if self.port==None:
loginUrl='http://%s/%s'%(self.ip,loginPath)
else:
#url='http://'+self.ip+':'+self.port+'/'+self.data['接口地址']
loginUrl="http://%s:%d/%s"%(self.ip,self.port,loginPath)
print(loginUrl)
loginParams=copy.deepcopy(Login.basicArg)
loginParams['account']=self.account
loginParams['password'] = self.password
print(loginParams)
print(Login.basicArg)
loginData = requests.post(loginUrl, data=loginParams)
if '"code":0' not in loginData.text:
print("登录失败,正在重新登录")
loginData = requests.post(loginUrl, data=loginParams)
print(loginData.text)
loginJson=json.loads(loginData.text)
print(loginJson["data"]["userAuth"]["token"])
return loginJson["data"]["userAuth"]["token"],loginJson["data"]["jtoken"]
def common_arg(self,token,jtoken):
commonHeaders=copy.deepcopy(Login.headers)
commonParams=copy.deepcopy(Login.basicArg)
commonHeaders["jtoken"]=jtoken
commonParams["token"]=token
return commonHeaders,commonParams
3.接口执行与数据分析类
class WebRequest(object):
#类初始化
def __init__(self,ip,data,port=None):
self.ip=ip
self.port=port
self.data=data
#self.basicData=basicData
#self.basicHeaders=basicHeaders
#请求地址url拼接
def url_joint(self):
if self.port==None:
url='http://%s/%s'%(self.ip,self.data['接口地址'])
else:
#url='http://'+self.ip+':'+self.port+'/'+self.data['接口地址']
url="http://%s:%d/%s"%(self.ip,self.port,self.data['接口地址'])
return url
#post请求,返回响应数据
def interface_post(self,url,data,headers):
postData=requests.post(url,data,headers=headers)
postText=postData.text
return postText
#get请求,返回响应数据
def interface_get(self,url,data,headers):
getData=requests.get(url,data,headers=headers)
getText=getData.text
return getText
class DataAnalyze(object):
def __init__(self,jsonData):
self.jsonData=jsonData
def data_analyze(self):
if self.jsonData["code"]==0 and self.jsonData["msg"]=='操作成功':
print("接口调用成功!")
未完待续~