框架功能介绍
1.自动整理接口测试用例:只需使用抓包工具,将需要接口请求另存为HAR文件,执行har2excel.bat即可自动生成接口请求测试用例,同时将接口请求的host地址写入到配置文件(测试用例仅生成正向用例,断言方式默认为整个响应结果结构对比,即实际测试响应结果的JSON字符串结构与测试用例中的预期结果JSON字符串结构对比)(每次生成Excel用例前都会先将原有testcase.xlsx文件备份);
2.支持用例间参数传递,如:在01接口请求参数、或者响应结果中的某一个节点值保存为指定变量名,在02接口中通过${自定义变量名}进行引用;
3.断言方式丰富:JSON结构对比、JSON节点值大于XXX、JSON节点值等于XXX、节点值不等于XXX、JSON节点值小于XXX、JSON节点值包含XXX、JSON节点值不包含XXX、JSON节点名称是否存在、JSON节点值数组长度大于XXX、JSON节点值数组长度等于XXX、JSON节点值数组长度小于XXX、JSON节点值类型为XXX(int、str、list、dict、float、tuple);
4.自动生成python测试脚本(根据config.py文件中CreateTestScript值决定),测试人员可以对生产的测试脚本进行修改,修改后需修改config.py文件中CreateTestScript值不=1,否则仍会重新生成新的测试脚本并按照新的测试脚本执行测试(每次生成脚本都会先将test*.py的测试脚本备份,但测试过程不再执行);
5.测试执行结果回写Excel表格:测试执行结果会回写到Excel测试用例中,同时测试用例执行完成后会自动打开浏览器呈现本次测试的测试报告。
6.详细的log日志:每执行一次测试,会产生一个log文件,存放在log目录下,记录本次测试脚本执行所有过程;
目录结构
今天我们来分享python接口自动化测试框架中,如何使用python操作Excel测试用例,并在用例执行结束之后,将测试结果写入到Excel表格中方便查看。
以下是实际代码:
'''
describe:解析Excel格式测试用例文件
date:2022/7/12
'''
from openpyxl import load_workbook
import os
from common.loghandler import logger
from openpyxl.styles import PatternFill
class ExcelHandler:
def __init__(self, filepath):
# 如果文件存在,则加载Excel表格
if os.path.isfile(filepath):
self.filepath = filepath
self.wb = load_workbook(self.filepath)
else:
logger.error("Excel文件不存在:{}".format(filepath))
def open_sheet(self, sheetname):
# 操作某一张sheet表
ws = self.wb[sheetname]
return ws
# 获取所有标签名,返回标签列表
def get_sheets_name(self):
return self.wb.sheetnames
# 获取某一个sheet下的数据
def get_data_by_sheetname(self, sheetname):
sheets = self.get_sheets_name()
if sheetname in sheets:
current_sheet = self.wb[sheetname]
try:
datas = list(current_sheet.values)
if len(datas) > 1:
logger.info("Excel文件的{}标签测试数据提取成功!".format(sheetname))
test_datas = []
for row in datas[1:]:
# 第一行时表头,不需返回
test_datas.append(dict(zip(datas[0], row)))
return test_datas
else:
logger.error("Excel文件的{}标签没有测试数据!".format(sheetname))
except Exception as e:
logger.error("Excel文件的{}标签数据读取失败!".format(sheetname))
else:
logger.error("Excel文件不存在 {} 标签".format(sheetname))
# ------------20220726新增--------------
# 获取表格的总行数和总列数
def get_row_clo_num(self,sheetname):
ws = self.open_sheet(sheetname)
rows = ws.max_row
columns = ws.max_column
return rows, columns
# 获取某个单元格的值
def get_cell_value(self, sheetname, row, column):
ws = self.open_sheet(sheetname)
cellvalue = ws.cell(row=row, column=column).value
return cellvalue
# 获取某列的所有值
def get_col_values(self, sheetname, column):
ws = self.open_sheet(sheetname)
rows = ws.max_row
columndata = []
for i in range(1, rows + 1):
cellvalue = self.ws.cell(row=i, column=column).value
columndata.append(cellvalue)
return columndata
# 获取某行所有值
def get_row_values(self, sheetname,row):
ws = self.open_sheet(sheetname)
columns = ws.max_column
rowdata = []
for i in range(1, columns + 1):
cellvalue = self.ws.cell(row=row, column=i).value
rowdata.append(cellvalue)
return rowdata
# 获取单元格所在的列
def get_cell_column(self,value,sheetname, row):
ws = self.open_sheet(sheetname)
column = ws.max_column
for i in range(1,column+1):
cell_value = ws.cell(row=row,column=i).value
if cell_value == value:
return i
# 获取单元格所在的行
def get_cell_row(self,value,sheetname, col):
ws = self.open_sheet(sheetname)
row = ws.max_row
for i in range(1,row+1):
cell_value = ws.cell(row=i,column=col).value
if cell_value == value:
return i
# 获取单元格所在的行和列
def get_cell_row_col(self,value,sheetname):
ws = self.open_sheet(sheetname)
row = ws.max_row
col = ws.max_column
for i in range(1,row+1):
for j in range(1,col+1):
cell_value = ws.cell(row=i,column=j).value
if cell_value == value:
return i,j
# 设置某个单元格的值
def set_cell_value(self, sheetname, row, colunm, cellvalue):
ws = self.open_sheet(sheetname)
try:
ws.cell(row=row, column=colunm).value = cellvalue
if cellvalue == "失败":
ws.cell(row=row, column=colunm).fill = PatternFill(fill_type='solid', fgColor='FD140A')
elif cellvalue == "通过":
ws.cell(row=row, column=colunm).fill = PatternFill(fill_type='solid', fgColor='28B605')
elif "异常" in cellvalue:
ws.cell(row=row, column=colunm).fill = PatternFill(fill_type='solid', fgColor='FFFF00')
self.wb.save(self.filepath)
except Exception as e:
print(e)
ws.cell(row=row, column=colunm).value = "结果写入失败"
self.wb.save(self.filepath)
上述代码中,我们对于测试结果通过、不通过、结果异常的用例,在测试结果的单元格中,设置了不同的背景色,方便一眼看出哪些用以存在问题。
最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。