ITniu

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

分类:

技术点:

相关文章: