Py

python+requests+excel 实现接口自动化测试

2018-12-06  本文已影响63人  JoyceChen_

前言

自己摸索写了一套接口自动化的脚本,目前可以完成本人测试的需求。在这里做下分享。(也许会有各种局限性,欢迎大家给我留言~~)

方案

目前我们常用的接口协议是http协议,其测试的基本原理是模拟前端(客户端)向服务器发送数据,得到相应的响应数据,从而判断接口是否可以正常的进行数据交换。

本人的想法是在excel中维护请求数据也就是用例,通过脚本读取excel数据,构造请求;判断响应结果与excel表中的校验字段是否一致,同时将执行结果更新到excel表中。

excel用例格式如下: 用例表.png

说明:
关键字:接口请求的方式。目前支持的有两种:post,get
参数:post方式参数格式需为json串;get方式参数格式为:parameter1=value1&parameter2=value2
headers:请求头,需为json格式;若接口无需请求头,放空即可
校验字段:响应结果中的某个字段,与校验值一起判断是否执行成功

执行结果如下: 执行结果.png

附上代码:
interfacetest.py

import requests
import xlrd
import json
import xlwt
from xlrd import open_workbook

def xlsx_open(filepath):
    book = xlrd.open_workbook(filepath)
    return book

def xlsx_getRow(sheet, row):
    object = {}
    object["method"] = sheet.cell_value(row, 2)
    object["host"] = sheet.cell_value(row, 3)
    object["path"] = sheet.cell_value(row, 4)
    object["url"] = object["host"] + object["path"]
    object["params"] = sheet.cell_value(row, 5)
    object["header"] = sheet.cell_value(row, 6)
    object["code"] = sheet.cell_value(row, 7)
    object["expected_code"] = sheet.cell_value(row, 8)
    if object["header"] == "":
        object["header"] = None
    return object

def xlsx_request(object):
    try:
        if object["method"] == "post":
            response = requests.post(object["url"], data=json.loads(object["params"]), headers=object["header"], cookies=object["cookies"])
            result = response.json()
        elif object["method"] == "get":
            response = requests.get(object["url"], object["params"], headers=object["header"], cookies=object["cookies"])
            result = response.json()
        else:
            print("Unknown method " + object["method"])
    except requests.exceptions.ConnectTimeout as e:
        result = {object["code"]: "timeout"}

    print(result)
    return result

def xlsx_set(sheet, row, col, value, red=False):
    style = "font:colour_index red;"
    if red == False:
        sheet.write(row, col, value)
    else:
        sheet.write(row, col, value, xlwt.easyxf(style))

def xlsx_save(book, filepath):
    book.save(filepath)

def dosheet(brd, bwt, sheetIndex, cookies=None):
    brd_sheet = brd.sheets()[sheetIndex]
    bwt_sheet = bwt.get_sheet(sheetIndex)
    count = brd_sheet.nrows
    for i in range(1, count):
        object = xlsx_getRow(brd_sheet, i)
        object["cookies"] = cookies
        result = xlsx_request(object)

        if result.get(object["code"]) == object["expected_code"]:
            xlsx_set(bwt_sheet, i, 9, "pass", False)
            xlsx_set(bwt_sheet, i, 10, result[object["code"]], False)
        else:
            xlsx_set(bwt_sheet, i, 9, "fail", True)
            xlsx_set(bwt_sheet, i, 10, result[object["code"]], False)


runtest.py

from interfacetest import xlsx_open
from interfacetest import xlsx_save
from interfacetest import dosheet
import requests
from xlutils.copy import copy


# 打开文件
brd = xlsx_open("接口用例.xlsx")
# copy文件用于写入结果
bwt = copy(brd)

# 获取cookie
# url = "http://xxx"
# data = {
# "name":"xxx",
# "password":"xxx"
# }
# response = requests.post(url,data)
# c = response.cookies
# cookies = dict(c)

# 执行文件
dosheet(brd, bwt, 0)
# dosheet(brd, bwt, 1, cookies)

# 保存
xlsx_save(bwt, "用例result.xlsx")

说明:

  1. 部分接口需要传入token的话,自行加入获取代码,传参中加入cookie字段 获取cookie.png
  2. 需要导入requests库,一个很实用的python HTTP客户端库
  3. python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。但xlwt只能在原文件中修改,我希望能够保留原用例表,所以引入了中间库xlutils(依赖于xlrd和xlwt)提供复制excel文件内容和修改文件的功能

以上内容对大家有用的话,麻烦点个赞。也欢迎大家给我反馈问题,一起进步~

上一篇下一篇

猜你喜欢

热点阅读