--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!\')