一、背景
自动化测试中我们通常需要实现数据驱动,比如常见的方法,我们会将接口的各项数据放在Json或Excel文件中,那么如何读取操作Json或Excel文件中的数据,用于接口使用呢?
二、具体操作
2.1 读取Json文件数据:
工程目录如下图:
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,读取结果:
读取出来是一个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文件数据:
Excel表格中数据如下:
读取数据的工具类: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中的数据,结果如下:
[{'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":"成功"}'}]
=========================================================
以上就是本篇文章的全部内容,如果对你有帮助,
欢迎扫码关注程序员杨叔的微信公众号,获取更多测试开发干货内容资料,一起交流成长: