接口测试代码

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

posted @ 2017-03-06 11:53  easymoneySniper  阅读(533)  评论(0编辑  收藏  举报