在上一章, 我封装了http_service, 如果你不知道的话, 直接点击《Python3,接口自动化框架之封装http_service》跳转去看。
当然,也有小伙伴私下跟我说, 没想到, http_service的封装, 会这么简单。
其实... 确实... 不难...
今天,我们继续来封装接口自动化框架。
在封装之前, 我们先想一个问题:
你喜欢使用脚本来维护测试用例, 还是喜欢用excel来维护测试用例?
如果你的接口参数经常改变, 使用脚本来维护,必然不是一个最高效的方式,
这个时候, excel的维护方式,就排上用场了。
让代码直接读取excel里面的数据进行接口测试, 想想是不是就开心呢?
并且excel维护的另两个好处:
①如果你的接口有数据依赖, 那么excel方式维护方便;
②针对不会写代码的同学,使用这个接口框架,也能进行测试;
③数据修改方便;
你看,使用excel来作为测试case, 有这么多好处, 为什么,你还要写脚本呢?
别告诉我, 你为了练习敲键盘.....
-->这是小学校才做的事情。
所以, 我们的接口自动化框架, 就是用读取excel 作为测试case。
我们一起来看代码。
代码也很简单, 主要思路:
①依旧是用requests 库来进行封装请求方式、url、其你去参数
②读取excel表的数据
③二次封装读取Excel表数据,返回data列表
③二次封装写入excel表数据
④同时追加断言,报错就抛出异常
接下来,就看代码。
# -*- coding:utf-8 -*- # @Time : 2019-10-23 # @Author : Carl_奕然 import json import requests from openpyxl.styles import colors from Interface_python3.public.http_service import HTTP from Interface_python3.public import config,read_excel,write_excel # 拼接url,path参数是域名后面的虚拟目录部分 def get_url(path): return ''.join([config.base_url, path]) # 封装requests请求方法,方法参数为:请求方式,接口url,请求参数 def get_response(method, url, **DataALL): if method == 'get': resp = HTTP().get(url, **DataALL) elif method == 'put': resp = HTTP().put(url, **DataALL) elif method == 'post': resp = HTTP().post(url, **DataALL) elif method == 'delete': resp = HTTP().delete(url, **DataALL) else: return "no the method" resp.encoding = 'UTF-8' return resp # 封装requests请求方法,请求参数testdata数据是从Excel表读取的 def get_excel_response(testdata): method = testdata["method"] # 请求方式 url = testdata["url"] # 请求url # url后面的params参数 try: params = eval(testdata["params"]) except: params = None # 请求头部headers try: headers = eval(testdata["headers"]) except: headers = None # post请求body内容 try: bodydata = eval(testdata["body"]) # 可在这里实现excel的body里面某个字段动态赋值,实现接口参数的关联,如token if 'accessToken' in testdata["body"]: bodydata['accessToken'] = config.accessToken except: bodydata = {} # post请求body类型,判断传data数据还是json type = testdata["type"] if type == "data": body = bodydata elif type == "json": body = json.dumps(bodydata) else: body = json.dumps(bodydata) # 发起网络请求,并返回数据 try: r = requests.request(method=method, url=url, params=params, headers=headers, data=body) r.encoding = 'UTF-8' return r except Exception as msg: return msg # 这个是二次封装读取Excel表数据,返回的data是列表类型,列表中子元素是字典类型 def get_excel_data(file_name, sheet_name): # fileName是文件名(要带后缀),sheetName是表名 sheet = read_excel.ReadExcel(config.test_data_path + file_name, sheet_name) data = sheet.get_dict_data() return data # 这个是二次封装写入Excel表数据,fileName是文件名,sheetName是表名,r是网络请求结果 def write_to_excel(file_name, sheet_name, test_data, r): # 这里的文件夹路径要修改为你的 write_excel.copy_excel(config.test_data_path + file_name) # 复制备份一份测试数据 wt = write_excel.WriteExcel(config.test_data_path + file_name, sheet_name) row = test_data.get('rowNum') color = colors.BLACK try: if test_data.get('isCheckStatusCode'): if str(r.status_code) == test_data.get('checkpoint'): wt.write(row, 12, "pass", color) # 测试结果 pass else: color = colors.RED wt.write(row, 12, "fail", color) # 测试结果 fail else: if test_data.get("checkpoint") == '': wt.write(row, 12, "checkpoint为空", colors.RED) # 没有设置检查点的值 elif test_data.get("checkpoint") in r.text: wt.write(row, 12, "pass", color) # 测试结果 pass else: color = colors.RED wt.write(row, 12, "fail", color) # 测试结果 fail wt.write(row, 10, str(r.status_code), color) # 写入返回状态码statuscode,第8列 wt.write(row, 11, str(r.elapsed.total_seconds()), color) # 耗时 wt.write(row, 13, r.text, color) # 响应内容 wt.write(row, 14, "") # 异常置空 wt.wb.close() except Exception as msg: color = colors.RED wt.write(row, 10, "") wt.write(row, 11, "") wt.write(row, 12, "fail", color) wt.write(row, 13, "") wt.write(row, 14, str(r), color) wt.wb.close() return wt
看到这里, 是不是觉得,自己也能写base.py的配置了。
其实,都是一样的, 不难的。
所以,要想写好自动化接口框架, 满足以下3点即可:
- 首先,需要先非常熟悉接口测试, 非常熟悉你的项目,
- 其次,有编码的能力,
- 第三,有经验...
你看,还觉得编写接口自动化框架难吗......