持续完善中……
使用python2.7有写过一篇ddt,此处再用3.6写一次,这次把接口headers、url、body、expect、result都写到excle中
目录
1、模块准备
2、读写excle的类
3、使用ddt
1、模块准备
ddt数据驱动模块:
pip install ddt -i https://pypi.tuna.tsinghua.edu.cn/simple
xlrd读取excle模块:
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
openpyxl写excle模块:pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
2、读写excle的类
读取excle:
- 打开workbook获取Book对象
xlrd.open_workbook(filename[, logfile, file_contents, ...]):打开excel文件
filename:需操作的文件名(包括文件路径和文件名称);
若filename不存在,则报错FileNotFoundError;
若filename存在,则返回值为xlrd.book.Book对象
- 获取Book对象中所有sheet名称
BookObject.sheet_names():获取所有sheet的名称,以列表方式显示
封装读取文件,返回字典对象:
import xlrd import os class ExcelUtil(): def __init__(self,exclePath,sheetName="Sheet1"): self.data=xlrd.open_workbook(exclePath) self.table=self.data.sheet_by_name(sheetName) #获取第一行作为key值 self.keys=self.table.row_values(0) #获取总行数 self.rowNum=self.table.nrows #获取总列数 self.colNum=self.table.ncols def dict_data(self): if self.rowNum<=1: print ("总行数小于1") else: r=[] j=1 for i in list(range(self.rowNum-1)): s={} #从第二行取对应value值 s['rowNum']=i+2 values=self.table.row_values(j) for x in list(range(self.colNum)): s[self.keys[x]]=values[x] r.append(s) j+=1 return r if __name__ =="__main__": cur_path=os.path.abspath("") #获取脚本所在路径 report_path=os.path.join(cur_path,"data.xlsx")#将当前脚本和测试数据放在一个文件夹下 print(report_path) data=ExcelUtil(report_path) print(data.dict_data()) # print(data)
写excle:
根据行列找到单元格,然后将值写入单元格,并保存
from openpyxl import load_workbook import openpyxl class Write_excel(object): def __init__(self,filename): self.filename=filename self.wb=load_workbook(self.filename) self.ws=self.wb.active def write(self,row_n,col_n,value): self.ws.cell(row_n,col_n).value=value self.wb.save(self.filename)
if __name__=="__main__": m2="G:\api\jpress_api\common\data03.xlsx" wt=Write_excel(m2) wt.write(1,2,"test")
3、使用ddt
第一步:读取excle的第一行头部信息,data1是通过dict_data()函数获取到字典对象,形如:[{'rowNum': 2, 'id': 1.0, 'url': 'xx', 'headers': 'xxx','body':'xx'}]
通过字典取值方式得到str对象,然后通过eval()再转成dict传入post请求中
url=data1['url'] #url body=eval(data1['body'])#body headers=eval(data1['headers']) #headers expect=data1['expect'] #期望值
注:使用eval函数将str转换成字典类型的值,当然也可以使用json.loads()来转换
第二步:用excle准备数据
第三步:使用ddt模块
ddt模块他会顺序取每一行数据进行执行,就算报错,它也会完成所有组别数据的遍历
import ddt from common.readexcle import * import unittest from common.write_excle import * import requests #读取本地的测试数据 datapath="G:\api\jpress_api\common\data01.xlsx" d=ExcelUtil(datapath) testdata=d.dict_data() #读excle wt=Write_excel(datapath) #写excle @ddt.ddt class Testme(unittest.TestCase): def setUp(self): self.requests=requests #开始读取用例 @ddt.data(*testdata) def test(self,data1): id=data1['id'] url=data1['url'] #url body=eval(data1['body'])#body headers=eval(data1['headers']) #headers expect=data1['expect'] #期望值 result=self.requests.post(url,body,headers=headers) myresult=result.json()["message"] #预期结果等于实际结果,则设置用例结果为pass,否则为fail if myresult==expect: data1['result']="pass" else: data1['result']="fail" #将用例结果写回到excle中 wt.write(id+1,6,data1['result']) self.assertEqual(expect,myresult) #实际结果等于预期结果 if __name__=="__main__": unittest.main()
excle结果: