read_excel.py 6.19 KB
Newer Older
bobo committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test62
# FileName:      read_excel.py
# Author:       lao_zhao
# Datetime:     2024/9/4 14:53
# Description:
# 
# ---------------------------------------------------------------------------
import openpyxl
from apiAutoTest_v3 import log
from apiAutoTest_v3.common.read_json import read_json
from apiAutoTest_v3.common.read_project_ini import ReadProjectIni
from apiAutoTest_v3.common.read_user_ini import ReadUserIni
from apiAutoTest_v3.data_config.settings import *


# read_excel.py文件的功能:就是获取每个用户的测试数据,并将测试数据存放在一个二维列表中


class ReadExcel:
    def __init__(self, user_dir_name):
        """获取所有json文件的路径,并读取json文件,再获取excel文件的路径,加载excel的工作簿,并获取工作表的名称,再获取工作表"""
        # 被测系统的域名存放在项目的ini配置文件中,所有需要ReadProjectIni对象,调用get_host方法获取被测系统的域名
        self.pro_ini = ReadProjectIni()
        # 先读取每个用户的配置文件的对象。ReadUserIni对象。因为每个用户的数据存放的文件信息放在每个用户的ini配置文件中。
        user_ini = ReadUserIni(user_dir_name)
        # 根据ReadUserIni对象获取每个用户的数据文件路径
        case_data_path = user_ini.get_file_path(FILE_CASE)
        expect_data_path = user_ini.get_file_path(FILE_EXPECT)
        sql_data_path = user_ini.get_file_path(FILE_SQL)

        excel_path = user_ini.get_file_path(FILE_EXCEL)
        table_name = user_ini.get_table_name(TABLE_kEY)

        self.case_data_dict = read_json(case_data_path)
        self.expect_data_dict = read_json(expect_data_path)
        self.sql_data_dict = read_json(sql_data_path)

        try:
            wb = openpyxl.load_workbook(excel_path)
            self.ws = wb[table_name]
        except Exception as e:
            log.error(f"加载excel的工作簿或获取excel的工作表时产生错误,错误为:{e}, excel的路径为:{excel_path}, 工作表的名称为:{table_name}")
            raise e

    def __get_cell_value(self, column, row):
        """根据列号和行号获取指定单元格数据"""
        try:
            cell_value = self.ws[column+str(row)].value
        except Exception as e:
            log.error(f"获取指定单元格数据,出错,错误为:{e}, 传入的列号:{column}和行号:{row}")
            raise e
        else:
            if cell_value is None:
                return None
            elif cell_value.strip():
                return cell_value.strip()

    def module_name(self, row):
        """根据行号,获取模块名称"""
        return self.__get_cell_value(MODULE, row)

    def api_name(self, row):
        """根据行号,获取接口名称"""
        return self.__get_cell_value(API, row)

    def case_url(self, row):
        """根据行号,获取用例的url"""
        path = self.__get_cell_value(URL, row)
        if path:
            # 被测系统的域名存放在项目的ini配置文件中,所有需要ReadProjectIni对象,调用get_host方法获取被测系统的域名
            return self.pro_ini.get_host(HOST_KEY) + path

    def case_req_method(self, row):
        """根据行号,获取用例的请求方法"""
        return self.__get_cell_value(REQ_METHOD, row)

    def case_mime(self, row):
        """根据行号,获取用例请求的媒体类型"""
        mime = self.__get_cell_value(MIME, row)
        if mime:
            return mime.lower()

    def case_data(self, row):
        """根据行号,获取用例数据"""
        case_data_key = self.__get_cell_value(CASE_DATA, row)
        if case_data_key:
            module_name = self.module_name(row)
            api_name = self.api_name(row)
            return self.case_data_dict[module_name][api_name][case_data_key]

    def expect_data(self, row):
        """根据行号,获取期望数据"""
        expect_data_key = self.__get_cell_value(EXPECT_DATA, row)
        if expect_data_key:
            module_name = self.module_name(row)
            api_name = self.api_name(row)
            return self.expect_data_dict[module_name][api_name][expect_data_key]

    def sql_data(self, row):
        """根据行号,获取sql语句"""
        sql_data_key = self.__get_cell_value(SQL_DATA, row)
        if sql_data_key:
            module_name = self.module_name(row)
            api_name = self.api_name(row)
            return self.sql_data_dict[module_name][api_name][sql_data_key]

    def sql_type(self, row):
        """根据行号,获取sql语句的类型"""
        value = self.__get_cell_value(SQL_TYPE, row)
        if value:
            return value.lower()

    def update_key(self, row):
        """根号行号,获取更新的key"""
        return self.__get_cell_value(UPDATE_KEY, row)

    def case_title(self, row):
        """根据行号,获取用例的标题"""
        return self.__get_cell_value(TITLE, row)

    def case_level(self, row):
        """根号行号,获取用例的等级"""
        return self.__get_cell_value(LEVEL, row)

    def get_data(self):
        """获取所有的测试数据,并存放在一个二维列表中"""
        list_data = []
        for row in range(2, self.ws.max_row+1):
            module_name = self.module_name(row)
            api_name = self.api_name(row)
            title = self.case_title(row)
            level = self.case_level(row)
            url = self.case_url(row)
            method = self.case_req_method(row)
            mime = self.case_mime(row)
            case_data = self.case_data(row)
            expect_data = self.expect_data(row)
            sql_type = self.sql_type(row)
            sql_data = self.sql_data(row)
            update_key = self.update_key(row)
            if url is not None and method is not None and expect_data is not None:
                list_data.append([module_name, api_name, level, title, url, method, mime, case_data, expect_data, sql_type, sql_data, update_key])
        else:
            return list_data


if __name__ == '__main__':
    excel = ReadExcel("lao_zhang")
    print(excel.get_data())