010、011、012【前程贷—简化版,实战 04】用openpyxl 操作 excel表格

 

 

在上一节 (009、【前程贷—简化版,实战 03】 用excel设计测试用例,把测试数据分离)    用excel表格设计测试用例、分离数据后,就需要用到openpyxl 来获取表格中的数据,

本节主要演示封装 操作 excel 表格 ;

 

a、沿用上一节设计的测试用例表格,如下:

010、011、012【前程贷—简化版,实战  04】用openpyxl 操作 excel表格

 

b、项目的层级目录如下:

010、011、012【前程贷—简化版,实战  04】用openpyxl 操作 excel表格

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行)

010、011、012【前程贷—简化版,实战  04】用openpyxl 操作 excel表格

 

上一篇:openpyxl对合并单元格处理


下一篇:第10关 自动化办公 汇总表格文件