接口测试代码
--coding:utf-8 --
import requests,MYSQLdb,time,re
import urllib,urllib2
HOSTNAME='169...' #公共变量 主机IP
def readSQLcase():
'''
sql =
'''
conn = MYSQLdb.connect(user='root',passwd='test123',db='zentao',port=3306,host='192.168.5.79',charset='utf-8')
cursor = conn.cursor()
a1 = cursor.execute(sql)
info = cursor.fetchmany(a1)
for i in info:
case_list = []
case_list.append(i)
GetToken()
interfaceTest(case_list) #循环读取SQL中的一条测试用例
conn.commit()
cursor.close()
conn.close()
def interfaceTest(case_list): #读取一条接口测试用例
res_flags=[]
request_urls=[]
responses=[]
for case in case_list:
try:
case_id = case[0] #读取用例的关键信息用例id
interface_name = case[1] #读取用例的关键信息 接口名称 对应标题
method = case[3] #读取用例的关键信息 接口方法 对应方法 +-
url = case[5] # #读取用例的关键信息 接口url地址 对应keyword
param = case[2] #读取用例的关键信息接口参数列表 对应参数
res_check =case[4] #读取用例的关键信息 接口返回校验 对应预期结果
exception Exception,e:
retturn '测试用例格式不正确%s'%e
if param =='':
new_url ='http://'+HOSTNAME+url #如果接口没有参数,则接口设为hostname+url
elif param=='null':
new_url='http://'+HOSTNAME+url #如果接口参数为null,则接口设为hostname+url。
#注意,想知道接口有没有参数时,可在页面中输入null来判断是否有参数
else:
new_url=='http://'+HOSTNAME+url+'?'+urlParam(param) #如果接口有参数,接口设为hostname+url+param
request_urls.append(new_url)
if method.upper()=='GET': #如果接口方法为get方法,则读取如下 get请求和返回数据
print str(case_id)+‘ ’+new_url #打印用例id和接口地址
headers={
'HOST':HOSTNAME,
'Connection':'keep-alive',
'token':token,
'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'Apache-HttpClient/4.2.6(java 1.5)'
} #设置http头信息,包括主机名和13798359580用户登录token值
data = None
##### results = requests.get(new_url,data,headers=headers).txt #发送get请求,results得到 请求的返回数据
responses.append(results)
res = readRes(results,res_check) #对请求的返回数据进行校验,采用 正则表达式 校验,
#校验结果有三种 (pass,fail,jFIF)
if 'pass' == res:
writeResult(case_id,'pass') #写结果为pass到这个关联用例id
res_flags.append('pass')
if JFIF(results):
results = 'JFIF ok' #校验JFIF则为图片
else:
print('接口名称:'+interface_name)#打印接口名称
print ('接口地址:'+new_url) #打印接口地址
print ('响应数据:'+results) #打印响应数据 并打印接口id和返回SUCCESS
print (str(case_id) +'------------'+'SUCCESS'+'------------')
continue
print('接口名称:'+interface_name)#打印接口名称
print ('接口地址:'+new_url) #打印接口地址
print ('响应数据:'+results) #打印响应数据 并打印接口id和返回SUCCESS
print (str(case_id) +'------------'+'SUCCESS'+'------------')
else:
res_flags.append('fail')
writeResult(case_id,'fail') #写结果为fail到这个关联用例id
if reserror(results):
writeBug(case_id,interface_name,new_url,'api response is error',res_check)
#如果是接口响应异常,即服务器异常时,这种方式即直接打印出错信息记录bug写到数据库
else:
writeBug(case_id,interface_name,new_url,results,res_check)
#如果是接口校验数据错误,则用这种方式即把该接口的请求和响应数据记录bug,并写到数据库
print ('接口名称:'+interface_name)
print ('接口地址:'+new_ur)
print ('响应数据:'+results)
print (str(case_id)+'-----------'+'fail'+'-------------')
else: #如果不是get方法,则读取如下post请求和返回数据,以下注释部分与上面get完全一致,仅把get换成post即可,其他一样
headers={
'HOST':HOSTNAME,
'Connection':'keep-alive',
'token':token,
'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'Apache-HttpClient/4.2.6(java 1.5)'
} #设置http头信息,包括主机名和13798359580用户登录token值
data = None
##### results = requests.get(new_url,data,headers=headers).txt #发送get请求,results得到 请求的返回数据
responses.append(results)
res = readRes(results,res_check) #对请求的返回数据进行校验,采用 正则表达式 校验,
#校验结果有三种 (pass,fail,jFIF)
if 'pass' == res:
writeResult(case_id,'pass') #写结果为pass到这个关联用例id
res_flags.append('pass')
if JFIF(results):
results = 'JFIF ok' #校验JFIF则为图片
else:
print('接口名称:'+interface_name)#打印接口名称
print ('接口地址:'+new_url) #打印接口地址
print ('响应数据:'+results) #打印响应数据 并打印接口id和返回SUCCESS
print (str(case_id) +'------------'+'SUCCESS'+'------------')
continue
print('接口名称:'+interface_name)#打印接口名称
print ('接口地址:'+new_url) #打印接口地址
print ('响应数据:'+results) #打印响应数据 并打印接口id和返回SUCCESS
print (str(case_id) +'------------'+'SUCCESS'+'------------')
else:
res_flags.append('fail')
writeResult(case_id,'fail') #写结果为fail到这个关联用例id
if reserror(results):
writeBug(case_id,interface_name,new_url,'api response is error',res_check)
#如果是接口响应异常,即服务器异常时,这种方式即直接打印出错信息记录bug写到数据库
else:
writeBug(case_id,interface_name,new_url,results,res_check)
#如果是接口校验数据错误,则用这种方式即把该接口的请求和响应数据记录bug,并写到数据库
print ('接口名称:'+interface_name)
print ('接口地址:'+new_ur)
print ('响应数据:'+results)
print (str(case_id)+'-----------'+'fail'+'-------------')
def readRes(res,res_check): #校验结果。如果一致则给返回pass,否则返回错误提示
res = res.replace(':',"=").replace(':'."=") #校验时替换符号为=号,再进行校验
res_check = res_check.split(';')
for s in res_check:
if s in res:
pass
else:
return('错误,返回参数和预期结果不一致'+str(s))
return ('pass')
def urlParam(param): #参数值的替换
param1 = param.replace('*','&') #如果参数在数据库中为*,则为替换为&
param2 = param.replace('"','\"') #如果参数在数据库中为",则替换成",这是因为在页面中输入的",存储到数据库中就变成了",所以要替换
return (param2.replace(';','&')) #如果参数在数据库中为;,则替换为&
def GetToken(): #去用户登录的token值
global token #定义token全局变量
url = 'http://'+HOSTNAME+'/buyer/user/login.do' #用户登录接口的url
params = {
'phone':'13798359580',
'pwd':'57ec2dd791e31e2ef3076caf66ed9b79'
} #参数为登录的手机号和(加密过后的)密码
request = urllib2.Request(url = url,data = urllib.urlencode(params)) #发送接口请求url和参数 py3.5
response = urllib2.urlopen(request)
data = response.read()
regx = '.*"token":"(.*)","ud"' #正则表达式token,左匹配"token":",右匹配","ud"',
pm = re.search(regx,data)
token = pm.group(1)
regy = r'"state":(\d+)}' #正则表达式state,左匹配”state“:,右匹配 }
pn = re.search(regy,data)
state = pn.group(1)
if state == '0':
return True
return False
def reserror(results):
global html
regx = 'html'
pm = re.search(regx,results)
if pm:
return (regx)
return False
def JFIF(results):
global JFIF
regx = 'JFIF'
pm = re.search(regx,results)
if pm:
return (regx)
return False
def writeResult(case_id,result): #写结果到数据库
result = result.encode('utf-8')
now = time.strftime("%Y-%m-%d %H:%M:%S") #当前时间格式为此形式
sql ="UPDATE zt_testrun SET lastRunResult=%s,lastRunDate=%s,lastRunner='auto' where zt_testrun.task=8 and zt_testrun.'case'=%s;" #sql语句;结尾
param = (result,now,case_id) #把参数结果,时间,用例id作为动态
conn = MYSQLdb.connect(user='root',passwd='test123',db='zendao',port='3306',host='192.168.5.79',charset='utf-8')
cursor = conn.cursor()
cursor.execute(sql,param)
conn.commit()
cursor.close()
conn.close()
def writeBug(bug_id,interface_name,request,response,re_check):
if name=='main':
readSQLcase() #执行SQL中的测试用例以及相关操作
print('Done!')