python实现简单的http接口自动化

Posted mululu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现简单的http接口自动化相关的知识,希望对你有一定的参考价值。

今天给大家分享一个简单的Python脚本,使用python进行http接口的自动化测试,脚本很简单,逻辑是:读取excel写好的测试用例,然后根据excel中的用例内容进行调用,判断预期结果中的返回值和返回报文中的值是否一致,如果不一致则根据用例标题把bug提交到bug管理系统,这里使用的bug管理系统是bugfree。最后统计测试结果:总共执行多少条用例、通过多少条用例,失败多少条用例,邮件标题加上当前时间,将测试结果发送到指定邮箱。

实现步骤:

               1、读取excel,保存测试用例中的内容,这里需要定义一个读取excel的函数readExcel();

               2、根据excel中的请求url和参数拼接请求报文,调用接口,并保存返回报文,这里需要定义一个将请求数据转换为字典的函数param_To_Dic();

               3、读取返回报文,和预期结果对比,不一致的往bugfree数据库中写入一条bug,并且把请求报文、返回报文和测试结果写到测试用例的excel中,这里需要定义一个比对预期结果和返回结果的函数contrastRes(),一个往bugfree提交bug的函数writeBug(),一个将测试结果写入excel的函数copy_excel(),还需定义一个接口请求的函数interfaceTest()。

               4、统计测试结果,发送测试邮件。需定义一个send_email()的函数。

http接口最常用的两种请求方式,POST和GET两种方法,这篇博客分享的就是最简单常用的url请求。例如:http://192.168.21.129/bugfree/index.php/info/edit?type=bug&action=opened&product_id=1

需要用的到几个模块有:requests、xlrd(读取excel)、xlutils(写excel)、pymysql(连接数据库)、yagmail(发送邮件)这五个模块都是第三方模块,需要自己单独安装。

首先在excel中写好用例,需要有的字段 项目、用例id、接口名称、用例描述、请求方式、请求url、请求数据(多个的参数话用&分号隔开)、预期结果、请求报文、返回报文、测试人员、测试结果

测试用例截图如下:

技术分享图片

整体代码如下:

import xlrd,requests,time,pymysql,yagmail
from xlutils import copy

def readExcel(file_path):
    try:
        book = xlrd.open_workbook(file_path)
    except Exception as e:
        print(路径不在或者excel不正确,e)
    else:
        sheet = book.sheet_by_index(0)
        rows = sheet.nrows
        count_check = rows - 1
        case_list = []
        for i in range(rows):
            if i != 0:
                case_list.append(sheet.row_values(i))

    interfaceTest(count_check,case_list,file_path)

def interfaceTest(count_check,case_list,file_path):
    result_flags = []  #存测试结果,pass或fail
    request_urls = []  #存请求报文的list
    response = []     #存返回报文的list
    count_pass = 0
    count_fail = 0
    for case in case_list:
        try:
            product = case[0]       # 项目,提bug的时候可以根据项目来提
            case_id = case[1]       # 用例id,提bug的时候用
            interface_name = case[2]  # 接口名称,也是提bug的时候用
            case_detail = case[3]     # 用例描述
            method = case[4]      # 请求方式
            url = case[5]     # 请求url
            param = case[6]   # 入参
            res_check = case[7]   # 预期结果
            tester = case[10]    # 测试人员
        except Exception as e:
            print(测试用例格式不正确!%s % e)

        if param == ‘‘:
            new_url =url
            request_urls.append(new_url)
        else:
            new_url = url + ? + param
            request_urls.append(new_url)
        if method.upper() == GET:
            results = requests.get(url, params=param_To_Dic(param)).json()
            results_str = requests.get(url, params=param_To_Dic(param)).text
            response.append(results)
            res = contrastRes(results, res_check)
        else:
            results = requests.post(url, param_To_Dic(param)).json()
            results_str = requests.post(url, param_To_Dic(param)).text
            response.append(results)
            res = contrastRes(results, res_check)
        if pass in res:
            result_flags.append(pass)
            count_pass += 1
        else:
            result_flags.append(fail)
            count_fail += 1

            writeBug(case_id, interface_name, new_url, results_str, res_check)
    copy_excel(file_path, result_flags, request_urls, response,count_check,count_pass,count_fail)




def param_To_Dic(param):
    data_list = param.split(&)
    data = {}
    for i in data_list:
        k, v = i.split(=)
        data[k] = v
    return data

def contrastRes(results, res_check):
    check_code = res_check.split(=)[1]
    if int(check_code) == results[error_code]:
        return pass
    else:
        # print(错误,返回参数和预期结果不一致 + res_check)
        return fail

def copy_excel(file_path, res_flags, request_urls, response,count_check,count_pass,count_fail):
    book = xlrd.open_workbook(file_path)
    new_book = copy.copy(book)
    sheet = new_book.get_sheet(0)
    i = 1
    for request_url, response, flag in zip(request_urls, response, res_flags):
        sheet.write(i, 8, u%s % request_url)
        sheet.write(i, 9, u%s % response)
        sheet.write(i, 11, u%s % flag)
        i += 1
    new_book.save(%s_测试结果.xls % time.strftime(%Y%m%d%H%M%S))
    atta = %s_测试结果.xls % time.strftime(%Y%m%d%H%M%S)
    send_mail(count_check, count_fail, count_pass, atta)

def writeBug(bug_id, interface_name, request, response, res_check):
now = time.strftime("%Y-%m-%d %H:%M:%S") # 取当前时间,作为提bug的时间
bug_title = bug_id + ‘_‘ + interface_name + ‘_结果和预期不符‘ # bug标题用bug编号加上接口名称然后加上_结果和预期不符,可以自己随便定义要什么样的bug标题
step = ‘[请求报文]<br />‘ + request + ‘<br/>‘ + ‘[预期结果]<br/>‘ + res_check + ‘<br/>‘ + ‘<br/>‘ + ‘[响应报文]<br />‘ + ‘<br/>‘ + response # 复现步骤就是请求报文+预期结果+返回报文
sql = "INSERT INTO `bf_bug_info` (`created_at`, `created_by`, `updated_at`, `updated_by`, `bug_status`, `assign_to`, `title`, `mail_to`, `repeat_step`, `lock_version`, `resolved_at`, `resolved_by`, `closed_at`, `closed_by`, `related_bug`, `related_case`, `related_result`, " \\
"`productmodule_id`, `modified_by`, `solution`, `duplicate_id`, `product_id`, " \\
"`reopen_count`, `priority`, `severity`) VALUES (‘%s‘, ‘1‘, ‘%s‘, ‘1‘, ‘Active‘, ‘1‘, ‘%s‘, ‘系统管理员‘, ‘%s‘, ‘1‘, NULL , NULL, NULL, NULL, ‘‘, ‘‘, ‘‘, NULL, " \\
"‘1‘, NULL, NULL, ‘1‘, ‘0‘, ‘1‘, ‘1‘);" % (now, now, bug_title, step) # 拼sql,这里面的项目id,创建人,严重程度,指派给谁,都在sql里面写死,使用的时候可以根据项目和接口来判断提bug的严重程度和提交给谁
coon = pymysql.connect(user=‘root‘, passwd=‘123456‘, db=‘bugfree‘, port=3306, host=‘192.168.21.129‘, charset=‘utf8‘) # 建立连接,使用pymysql模块的connect方法连接mysql,传入账号、密码、数据库、端口、ip和字符集
cursor = coon.cursor() # 建立游标
cursor.execute(sql) # 执行sql
coon.commit() # 提交
cursor.close() # 关闭游标
coon.close() # 关闭连接

def send_mail(count_check,count_fail,count_pass,atta):
now = time.strftime("%Y-%m-%d %H:%M:%S")
username = ‘[email protected]
passwd = ‘xxxxxxxxxx‘
rece = ‘[email protected]
title = ‘python接口自动化测试报告‘+now
cc = ‘[email protected]
content = ‘大佬 你好:本次测试共运行%s条用例,失败%s条,成功%s条,测试用例详细执行结果请查看附件‘ % (count_check, count_fail, count_pass)
mail_host = ‘smtp.qq.com‘
mail = yagmail.SMTP(user = username,password = passwd,host = mail_host,smtp_ssl = True)
mail.send(to = rece,cc = cc,subject = title,contents = content,attachments = atta)
# print(‘发送成功!‘)

 查看测试邮件

技术分享图片

查看bugfree中bug的提交:

技术分享图片

 

























以上是关于python实现简单的http接口自动化的主要内容,如果未能解决你的问题,请参考以下文章

简单的python http接口自动化脚本

用Python实现接口自动化测试并保存测试结果

用Python实现接口自动化测试并保存测试结果

用Python实现接口自动化测试并保存测试结果

python+unittest+requests实现接口自动化

Python 基于http接口自动化测试