zoukankan      html  css  js  c++  java
  • 接口测试代码

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

  • 相关阅读:
    IsNull和IsEmpty的区别
    常用正则表达式
    VBScript函数
    SqlCommand类
    ubuntu更新grub
    例解 autoconf 和 automake 生成 Makefile 文件[转+个人修改]
    gEdit: 打造简洁,小巧的编程环境[转]
    Linux 常用命令
    GTK+ 简介
    “菜单” (menubar)和“工具栏”(toolbars)
  • 原文地址:https://www.cnblogs.com/ITniu/p/6509288.html
Copyright © 2011-2022 走看看