在上一节 (009、【前程贷—简化版,实战 03】 用excel设计测试用例,把测试数据分离) 用excel表格设计测试用例、分离数据后,就需要用到openpyxl 来获取表格中的数据,
本节主要演示封装 操作 excel 表格 ;
a、沿用上一节设计的测试用例表格,如下:
b、项目的层级目录如下:
c、各代码如下:
my_requests.py 代码如下:
# -*- coding:utf-8 -*- # Author: Sky # Email: 2780619724@qq.com import requests class MyRequests: def __init__(self): """ 初始化方法,初始化请求头; """ self.headers = {"X-Lemonban-Media-Type": "lemonban.v2"} # 方法 post/put... json=xxx, get方法用 params=xxx def send_reuqests(self, method, url, req_data, token=None): """ 调用requests库里面的方法去发起请求,并得到响应结果; :param url: 接口url :param method: 请求方法,get,psot :param req_data: 请求数据 :param token: 如果有token,添加token """ # 如果有token,添加token self.__del_header(token) # 注意 request() 方法是不带s的,requests库是带s的; if method.upper() == "GET": resp = requests.request(method, url, params=req_data, headers=self.headers) return resp if method.upper() == "POST": # 为了便于学习,简单的认为就是用 json 格式传; resp = requests.request(method, url, json=req_data, headers=self.headers) return resp def __del_header(self, token=None): """ 如果有token,添加token处理 :param token: 如果有token,添加token处理 """ if token: self.headers["Authorization"] = f"Bearer {token}"
excel_handler.py 代码如下:
# -*- coding:utf-8 -*- # Author: Sky # Email: 2780619724@qq.com import openpyxl # 封装一个xlsx表格操作类 class ExcelHandler: # 操作一个excel表格: # 第一步:打开工作簿 # 第二步:选取表单 # 第三步:读取数据 # 第四步:关闭打开的工作簿 def __init__(self, xlsx_file_path: str): """ 传入一个xlsx文件路径,用load_workbook()方法加载,如果文件加载不成功,抛出异常。如果成功,打开一个工作簿。 :param xlsx_file_path: xlsx文件路径 """ try: self.wb = openpyxl.load_workbook(xlsx_file_path) except FileNotFoundError: print('打开文件失败') raise # 不确定打开的是哪个表单 self.sh = None def close_workbook(self): """ 关闭当前打开的工作簿 :return: """ self.wb.close() def select_sheet_by_name(self, sheet_name: str): """ 根据传入的工作表的名字,打开工作表。 :param sheet_name: 作表的名字 """ self.sh = self.wb[f'{sheet_name}'] def read_all_rows_data(self): """ 从选定的表单当中,第一行作为key. 将后面的每一行数据,与第一行拼接成一个字典数据,作为一条测试用例数据。 将所有测试用例数据,添加到一个列表当中。 :return: 测试用例数据列表 """ # 获取表单的所有行,即获取表单的所有数据 sheet_all_rows = list(self.sh.values) # 把第一行作为数据的keys keys = sheet_all_rows[0] # print(keys) # 定义 cases_list 存放测试用例 cases_list = [] # 以下代码功能:excel表单第2行开始的每一行测试数据,与第一行的keys拼接成一个字典。 for single_row in sheet_all_rows[1:]: case_dict = dict(zip(keys, single_row)) cases_list.append(case_dict) return cases_list if __name__ == '__main__': eh = ExcelHandler(r'D:\SkyWorkSpace\WorkSpace\API_test\lm\day11\test_datas\test_register_cases.xlsx') eh.select_sheet_by_name('register_case') print(eh.read_all_rows_data()) eh.close_workbook()
test_my_requests.py 代码如下 :
from cases.my_requests import MyRequests import pytest from common.excel_handler import ExcelHandler import os # 一、准备 数据 cases # A、用os.path找到 xlsx 文件 file_dir = os.path.dirname(os.path.realpath('__file__')) base_dir = os.path.dirname(file_dir) test_datas = os.listdir(base_dir)[-2] file_name = os.path.join(base_dir, test_datas, 'test_register_cases.xlsx') # print(file_name) # B、调用common——>excel_handler.py 中已封装好的ExcelHandler类来操作excel表格 # # 1、打开xlsx表格;2、根据表单名字获取表格数据;3、读取数据; excel_handler = ExcelHandler(file_name) excel_handler.select_sheet_by_name('register_case') all_cases = excel_handler.read_all_rows_data() # print(all_cases) mrq = MyRequests() # 二、参数化测试用例 # pytest.mark.parametrize("item", cases) 中的 "item" 必须 和 def test_my_requests(item): 中的 item 名字一样 @pytest.mark.parametrize("item", all_cases) def test_my_requests(item): resp = mrq.send_reuqests(item['method'], item['url'], eval(item['req_data'])) print(resp.json())
执行结果如下( 删除了表格中的一些数据,只保留了3行) :