python读取数据文件实现数据驱动

一、背景

自动化测试中我们通常需要实现数据驱动,比如常见的方法,我们会将接口的各项数据放在Json或Excel文件中,那么如何读取操作Json或Excel文件中的数据,用于接口使用呢?

二、具体操作

2.1 读取Json文件数据:

工程目录如下图:
python读取数据文件实现数据驱动

Json文件内容:test_http_post_data.json

{
  "dataItem": [
    {
      "id": "testpost-1",
      "name": "草料二维码post接口1",
      "url":"/Apis/QrCode/saveStatic",
      "headers":{
        "Content-Type":"application/x-www-form-urlencoded",
        "Accept-Encoding":"gzip, deflate, br"
      },
      "parameters": {
        "info": 11111,
        "content": 11111,
        "level": "H",
        "size": 500,
        "fgcolor": "#000000",
        "bggcolor": "#FFFFFF",
        "transparent": "false",
        "type": "text",
        "base64": "data:image/png;base64",
        "codeimg": 1
      },
      "expectdata": {
        "status": "1",
        "qrtype":"static"
      }
    },

    {
      "id": "testpost-2",
      "name": "草料二维码post接口2",
      "url":"/Apis/QrCode/saveStatic",
      "headers":{
        "Content-Type":"application/x-www-form-urlencoded",
        "Accept-Encoding":"gzip, deflate, br"
      },
      "parameters": {
        "info": 22222,
        "content": 22222,
        "level": "H",
        "size": 500,
        "fgcolor": "#000000",
        "bggcolor": "#FFFFFF",
        "transparent": "false",
        "type": "text",
        "base64": "data:image/png;base64",
        "codeimg": 1
      },
      "expectdata": {
        "status": "1",
        "qrtype":"static"
      }
    }
  ]
}

创建一个读取Json文件的工具类:read_jsonfile_utils.py,代码如下:

import json
import os


class ReadJsonFileUtils:
    def __init__(self, file_name):
        self.file_name = file_name
        self.data = self.get_data()

    def get_data(self):
        fp = open(self.file_name,encoding='utf-8')
        data = json.load(fp)
        fp.close()
        return data

    def get_value(self, id):
        return self.data[id]

    @staticmethod
    def get_data_path(folder, fileName):
        BASE_PATH = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
        data_file_path = os.path.join(BASE_PATH, folder, fileName)
        return data_file_path

if __name__ == '__main__':
    data_file_path = ReadJsonFileUtils.get_data_path("resources", "test_http_post_data.json")
    # 读取文件中的dataItem,是一个list列表,list列表中包含多个字典
    param_data = ReadJsonFileUtils(data_file_path)
    data_item = param_data.get_value('dataItem')
    print(data_item)

读取文件中的dataItem,读取结果:
python读取数据文件实现数据驱动
读取出来是一个list列表,list列表中包含多个字典。用于接口中做数据驱动:

"""
@pytest.mark.parametrize是数据驱动;
data_item列表中有几个字典,就运行几次case
ids是用于自定义用例的名称

"""
@pytest.mark.parametrize("args", data_item, ids=['测试草料二维码post接口1','测试草料二维码post接口2'])
def test_caoliao_post_demo(self, args):
	# 打印用例ID和名称到报告中显示
	print("用例ID:{}".format(args['id']))
	print("用例名称:{}".format(args['name']))

2.2 读取Excel文件数据:
python读取数据文件实现数据驱动
Excel表格中数据如下:
python读取数据文件实现数据驱动
读取数据的工具类:get_excel_data_utils.py, 代码如下:

# coding: utf8
import xlrd
from xlrd import xldate_as_tuple
import datetime


class ExcelData(object):
    '''
    xlrd中单元格的数据类型
    数字一律按浮点型输出,日期输出成一串小数,布尔型输出0或1,所以我们必须在程序中做判断处理转换
    成我们想要的数据类型
    0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    '''
    def __init__(self, data_path, sheetname="Sheet1"):
        #定义一个属性接收文件路径
        self.data_path = data_path
        # 定义一个属性接收工作表名称
        self.sheetname = sheetname
        # 使用xlrd模块打开excel表读取数据
        self.data = xlrd.open_workbook(self.data_path)
        # 根据工作表的名称获取工作表中的内容
        self.table = self.data.sheet_by_name(self.sheetname)
        # 根据工作表的索引获取工作表的内容
        # self.table = self.data.sheet_by_name(0)
        # 获取第一行所有内容,如果括号中1就是第二行,这点跟列表索引类似
        self.keys = self.table.row_values(0)
        # 获取工作表的有效行数
        self.rowNum = self.table.nrows
        # 获取工作表的有效列数
        self.colNum = self.table.ncols

    # 定义一个读取excel表的方法
    def readExcel(self):
        # 定义一个空列表
        datas = []
        for i in range(1, self.rowNum):
            # 定义一个空字典
            sheet_data = {}
            for j in range(self.colNum):
                # 获取单元格数据类型
                c_type = self.table.cell(i,j).ctype
                # 获取单元格数据
                c_cell = self.table.cell_value(i, j)
                if c_type == 2 and c_cell % 1 == 0:  # 如果是整形
                    c_cell = int(c_cell)
                elif c_type == 3:
                    # 转成datetime对象
                    date = datetime.datetime(*xldate_as_tuple(c_cell, 0))
                    c_cell = date.strftime('%Y/%d/%m %H:%M:%S')
                elif c_type == 4:
                    c_cell = True if c_cell == 1 else False
                sheet_data[self.keys[j]] = c_cell.replace(' ', '').replace('\n', '').replace('\r', '')

            # 再将字典追加到列表中
            datas.append(sheet_data)
        # 返回从excel中获取到的数据:以列表存字典的形式返回
        return datas


if __name__ == "__main__":
    data_path = "..\\resources\\test_http_data.xls"
    sheetname = "Sheet1"
    get_data = ExcelData(data_path, sheetname)
    datas = get_data.readExcel()
    print(datas)

注意:代码中 c_cell.replace(’ ‘, ‘’).replace(’\n’, ‘’).replace(’\r’, ‘’) 是为了从Excel表格中读取到数据后,去掉数据中的空格和换行。

成果读取Excel中的数据,结果如下:
python读取数据文件实现数据驱动

[{'id': 'testpost-1', 'name': '草料二维码生成接口', 'url': 'https://cli.im/Apis/QrCode/saveStatic', 'parameters': '{"info":22222,"content":22222,"level":"H","size":500,"fgcolor":"#000000","bggcolor":"#FFFFFF","transparent":"false","type":"text","base64":"data:image/png;base64","codeimg":1}', 'expectData': '{"code":"0000","result":"成功"}'}, {'id': 'testpost-2', 'name': '草料二维码生成接口', 'url': 'https://cli.im/Apis/QrCode/saveStatic', 'parameters': '{"info":22222,"content":22222,"level":"H","size":500,"fgcolor":"#000000","bggcolor":"#FFFFFF","transparent":"false","type":"text","base64":"data:image/png;base64","codeimg":1}', 'expectData': '{"code":"0000","result":"成功"}'}]

=========================================================
以上就是本篇文章的全部内容,如果对你有帮助,

欢迎扫码关注程序员杨叔的微信公众号,获取更多测试开发干货内容资料,一起交流成长:
python读取数据文件实现数据驱动

上一篇:年初啃完这7套Java面试题,年后阿里P7稳了,收藏夹吃灰


下一篇:rust Cell 与 RefCell的区别