接口测试自动化框架-Python+requests+Excel 测试用例驱动

人就是不能懒!爬起来复盘一下写的测试用例驱动的接口自动化测试框架!

**

整理思路

**
用Python 读取Excel表内的测试用例,得到其中的各个信息,
然后用把数据稍作处理用requests发送请求获取返回结果,
再把结果和期望结果对比,判断该条用例能不能通过。
把实际结果和是否通过写入到一个新的Excel中,完成测试。

用到的第三方库

xlrd 读取Excel文档
requests 发送http请求
xlutils 复制文档,写入结果
urllib 的 parse 格式化一下url的后缀

下载第三方库

如果Python加入到环境变量了,那么:

python -m pip install requests
python -m pip install xlrd
python -m pip install xlutils

找到网络上公开的API接口

我用的是百度上搜索api第一个推荐的。。。可能是做了广告的,叫聚合数据。
地址: https://www.juhe.cn/
进取看就看到几个免费的绿色大字很显眼!!!来就用免费的!
接口测试自动化框架-Python+requests+Excel 测试用例驱动_第1张图片接口测试自动化框架-Python+requests+Excel 测试用例驱动_第2张图片

我们就用这两个。

查看API文档

通过api文档我们先用Python简单试一下该接口如何调用
接口测试自动化框架-Python+requests+Excel 测试用例驱动_第3张图片
ps:
记得注册实名,才能得到Key,也可以先用我的。
代码

import requests

Key = '646e09fa62e08de26ec3b5ccd1725acf'

url = 'http://apis.juhe.cn/mobile/get?phone=13429667914&key={}'.format(Key)

html = requests.get(url).text

print(html)

返回

{“resultcode”:“200”,“reason”:“Return Successd!”,“result”:{“province”:“浙江”,“city”:“杭州”,“areacode”:“0571”,“zip”:“310000”,“company”:“移动”,“card”:""},“error_code”:0}

可以看到我们成功了!
那么我们只需要在测试用例里把用例写好,就可以采取读取的方法来调用接口,来检查是否正确。

撰写接口测试用例

因为时间问题,还有主要是为了搭框架,我们就简单写几条,主要是代码实现
接口测试自动化框架-Python+requests+Excel 测试用例驱动_第4张图片

来了 他来了!!! 重点来了!!!

导入第三方库

import xlrd
import requests
from xlutils.copy import copy
from urllib import parse

读取Excel文件

excel_path = r'D:\Soft\VScode\Python\接口自动化用例.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
open_workbook的时候最好加上参数formatting_info=True,这样能保证你自己写的格式能保留
但是不能保留公式颜色什么的,确实是有点坑哈,不过不影响我们这框架的流程

得到第一个sheet

sheet_1 = excelfile.sheets()[0]

我们需要几个全局变量

answer = []
pass_or_false = []
body = {}
headers = {"User-Agent":
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2427.7 Safari/537.36"
}

answer 是用来保存返回值的列表,
pass_or_false 是用来保存返回值和期望值是否一样的列表
body 是我们requests调用请求时的url后边的路径
headers 就是我们模拟浏览器来调用接口

先写处理Excel类

处理Excel类

class Dispose_excel:
    # 得到case多少列函数
    def get_case_count(self):
        # 获取一共有多少列
        rows_count = sheet_1.nrows
        # 去掉表头 一共有多少个case
        real_count = rows_count - 6
        return real_count

我们写的第一个函数,能得到一共有多少个case需要我们来自动化执行
返回一个 int值

得到URL地址

# 得到接口URL地址
def get_url(self):
    url = rows[2]
    return url

我们在主程序运行的时候,会获取每行的内容,所以只要读取用例中第三行的url就可以,返回url

获取全部信息参数

# 得到请求方式
def get_way(self):
    way = rows[3]
    return way


# 得到请求参数
def requests_parameter(self):
    requests_parameter_cell = rows[4]
    return requests_parameter_cell

# 得到正确状态码
def should_status_code(self):
    status_code = rows[5]
    return status_code

# 得到预期结果
def expected_result(self):
    result = rows[6]
    return result

把结果写入的函数

# 写入 实际结果 和pass false
def write_result(self):
    answer_excel = copy(excelfile)
    workSheet = answer_excel.get_sheet(0)
    start = 6
    for i in range(len(answer)):
        workSheet.write(start,7,answer[i])
        workSheet.write(start,8,pass_or_false[i])
        start += 1
    answer_excel.save('接口测试结果.xls')

因为我们测试用例是从第7行开始的,所以start就是6(Python中一般都是以0开始,所以7行是6)
每次遍历都写入一个实际结果,和通不通过

接下来写新的Api类

得到接口信息类

class Api_get_result():
    # 初始化属性
    # url,phone,key,parameter_phone,parameter_key
    def __init__(self,url,parameter_keys,parameter_values):
        self.url = url
        for i in range(len(parameter_keys)):
            body[parameter_keys[i]] = parameter_values[i]

因为我们在测试用例中,把请求参数,写在一个字典中,所以我们要把字典解析传入进来
完善字典body

Post函数

# 发送 post请求
def api_post(self):
    get_url = self.url + '?' + parse.urlencode(body)
    res = requests.post(get_url,headers=headers)
    # res = requests.post(self.url,data = body,headers=headers)
    return res

此网站都是此格式,所以先把url拼完整,把参数和key都填入,之后用parse格式化一下
再用resquests.post 获取返回信息

Get函数

# 发送 get请求
def api_get(self):
    get_url = self.url + '?' + parse.urlencode(body)
    res = requests.get(get_url,headers=headers)
    return res

主程序

我们类,函数都写完了,现在需要写主流程,把各个模块拼接起来

if __name__ == "__main__":
    # 处理excel初始化函数
    document_data = Dispose_excel()
    # 得到一共有多少case
    count = document_data.get_case_count()

遍历

# 遍历
for i in range(6,6+count):
    # 得到各个参数
    rows = sheet_1.row_values(i)
    url = document_data.get_url()
    way = document_data.get_way()
    res_parameter = document_data.requests_parameter()
    status = document_data.should_status_code()
    expect_result = document_data.expected_result()

处理请求参数

    # 处理请求参数,变为字典
    parameter_dic = eval(res_parameter)
    num = len(parameter_dic)
    # 得到具体输入 api_get类里的参数
    parameter_dic_keys = []
    parameter_dic_values = []
    for i in range(num):
        parameter_dic_keys.append(list(parameter_dic.keys())[i])
        parameter_dic_values.append(list(parameter_dic.values())[i])

初始化api类

    # 调用api_get类
    api = Api_get_result(url,parameter_dic_keys,parameter_dic_values)

判断请求方式

    # 判断请求方式,发起请求 且得到结果
    if way == 'get':
        result = api.api_get().text
    elif way == 'post':
        result = api.api_post().text

把结果添加至列表

    answer.append(result)

判断是否与结果相符

    # 判断是否与预期结果相符
    if result == expect_result:
        pass_or_false.append('Pass')
    else:
        pass_or_false.append('False')

调用写入函数,把结果写入新表格

# 把结果写入新的表格
document_data.write_result()

完整代码

import xlrd
import requests
from xlutils.copy import copy
from urllib import parse


excel_path = r'D:\Soft\VScode\Python\接口自动化用例.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
sheet_1 = excelfile.sheets()[0]


# 全局变量
answer = []
pass_or_false = []
body = {}
headers = {"User-Agent":
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2427.7 Safari/537.36"
}

# 得到接口信息类
class Api_get_result():
    # 初始化属性
    # url,phone,key,parameter_phone,parameter_key
    def __init__(self,url,parameter_keys,parameter_values):
        self.url = url
        for i in range(len(parameter_keys)):
            body[parameter_keys[i]] = parameter_values[i]

    # 判断是get请求还是post请求
    def way_to_requests(self,way):
        if way == 'get':
            return True
        elif way == 'post':
            return False
        else:
            return None
    
    # 发送 post请求
    def api_post(self):
        get_url = self.url + '?' + parse.urlencode(body)
        res = requests.post(get_url,headers=headers)
        # res = requests.post(self.url,data = body,headers=headers)
        return res
    
    # 发送 get请求
    def api_get(self):
        get_url = self.url + '?' + parse.urlencode(body)
        res = requests.get(get_url,headers=headers)
        return res

# 处理Excel类
class Dispose_excel:
    # 得到case多少列函数
    def get_case_count(self):
        # 获取一共有多少列
        rows_count = sheet_1.nrows
        # 去掉表头 一共有多少个case
        real_count = rows_count - 6
        return real_count
    
    # 得到接口URL地址
    def get_url(self):
        url = rows[2]
        return url

    # 得到请求方式
    def get_way(self):
        way = rows[3]
        return way


    # 得到请求参数
    def requests_parameter(self):
        requests_parameter_cell = rows[4]
        return requests_parameter_cell
    
    # 得到正确状态码
    def should_status_code(self):
        status_code = rows[5]
        return status_code
    
    # 得到预期结果
    def expected_result(self):
        result = rows[6]
        return result
    
    # 写入 实际结果 和pass false
    def write_result(self):
        answer_excel = copy(excelfile)
        workSheet = answer_excel.get_sheet(0)
        start = 6
        for i in range(len(answer)):
            workSheet.write(start,7,answer[i])
            workSheet.write(start,8,pass_or_false[i])
            start += 1
        answer_excel.save('接口测试结果.xls')
        

   
if __name__ == "__main__":
    # 处理excel初始化函数
    document_data = Dispose_excel()
    # 得到一共有多少case
    count = document_data.get_case_count()
    # 遍历
    for i in range(6,6+count):
        # 得到各个参数
        rows = sheet_1.row_values(i)
        url = document_data.get_url()
        way = document_data.get_way()
        res_parameter = document_data.requests_parameter()
        status = document_data.should_status_code()
        expect_result = document_data.expected_result()
        # print(url,way,res_parameter,status,expect_result)
        # 处理请求参数,变为字典
        parameter_dic = eval(res_parameter)
        num = len(parameter_dic)
        # 得到具体输入 api_get类里的参数
        parameter_dic_keys = []
        parameter_dic_values = []
        for i in range(num):
            parameter_dic_keys.append(list(parameter_dic.keys())[i])
            parameter_dic_values.append(list(parameter_dic.values())[i])

        # 调用api_get类
        api = Api_get_result(url,parameter_dic_keys,parameter_dic_values)
        # 判断请求方式,发起请求 且得到结果
        if way == 'get':
            result = api.api_get().text
        elif way == 'post':
            result = api.api_post().text
        # 把每次结果都添加至列表
        answer.append(result)
        # 判断是否与预期结果相符
        if result == expect_result:
            pass_or_false.append('Pass')
        else:
            pass_or_false.append('False')
    
    # 把结果写入新的表格
    document_data.write_result()
    # 结束


执行完成后,排版后效果图

接口测试自动化框架-Python+requests+Excel 测试用例驱动_第5张图片
这样只要接口测试用例写的OK就能完成接口自动化!

现在这个有个BUG就是填入的信息,需要进入excel再排版一下 大概10秒搞定

源码在git上也可获取 https://github.com/fyp858585/nice_try
如果有Git 可以直接下载源码,选择你要下载的文件夹使用Git bash git clone https://github.com/fyp858585/nice_try.git

你可能感兴趣的:(接口测试自动化框架-Python+requests+Excel 测试用例驱动)