python自动化笔记——Excel之xlrd封装
封装一个读取Excel的方法,可以读取指定的表单里的内容,当需要多次读取Excel时,只需调用封装的类即可,不用重复编写代码
1、封装的excel类实现的需求是什么?
①每个方法都需要用到表单对象,加载Excel数据,所以要做初始化工作,加载Excel并选中指定表单
②读取表头数据,第1行case-id、title、请求data、作为key值
②读取表头以外的数据,即以列表形式,返回从第2行开始的所有数据,并从第2行取对应values值
注意:excel表值默认为常规类型,读取的excel表值只有两种类型:string和float(如1.0在表中显示1,实际程序处理成1.0, 而1.1在表中显示的是1.1浮点型)
import xlrd
import re
from xlutils.copy import copy
import excels
class ExcelUtil():
def __init__(self, excelPath, sheetName="login"):
self.data = xlrd.open_workbook(excelPath)
self.table = self.data.sheet_by_name(sheetName)
self.keys = self.table.row_values(0) #获取第一行作为key值
self.rowNum = self.table.nrows #获取总行
self.colNum = self.table.ncols #获取总列数
def dict_data(self):
if self.rowNum <= 1:
print("总行数小于1,请增加用例内容")
else:
r = []
for i in range(1, self.rowNum):
s = {}
# 从第二行取对应values值
values = self.table.row_values(i)#获取第i行作为key值
for x in range(self.colNum):
value = values[x]
if isinstance(values[x], float): #判断读取的值是否为浮点型(float)
value = int(values[x])
if float(value) != values[x]: #判断转换后的整型值是否等于原来的值,例如判断333是否等于333.0或者333是否等于333.1,
value = values[x] #如果不等,则不进行转换,仍然保留原值
s[self.keys[x]] = str(value) #密码不能为数值,要转换成字符串
r.append(s)
return r
以上封装完毕,接下来就是调用了
2、调用封装的Excel类
import unittest
from Utils.page import *
from excels import Excels
from page import Helper
import warnings
from ddt import *
import sheet_data as s
from excel_read_ddt import *
#用ddt读取excle表格请求
filepath = r'D:Pythonddtdata.xlsx'
@ddt()
class TestSolution(unittest.TestCase, Helper, ExcelUtil,Excels):
# 添加装饰器-前置条件环境准备
@classmethod
def setUpClass(cls):
warnings.simplefilter('ignore', ResourceWarning)
# 添加装饰器-后置条件进行关闭
@classmethod
def tearDownClass(cls):
pass
@data(*s.login)
def test_2_login(self,mydata):
"""登录接口"""
r = self.post(mydata['url'],json.loads(mydata['data']))
print("登录response:", r.json())
try:
self.assertEqual(json.loads(mydata['expected1']), r.status_code)#根据需求选择断言
self.assertEqual(int(mydata['expected2']), r.json()['code'])
self.assertIn(mydata['expected'], r.json()['message'])
3、封装往Excel回写数据的方法
①继续在Excel类里面写回写方法
from xlutils.copy import copy
class ExcelUtil():
@staticmethod
def write_back(excelPath, sheetName,row,col,result):
'''
把结果写进Excel并保存,此处注意要关闭Excel问卷才能成功写入
excelPath:文件路径
sheetName:指定表单
row:指定写入的行
col:指定写入的列
result:写入的结果
'''
wb= xlrd.open_workbook(excelPath)
cwb = copy(wb)
sheet = cwb.get_sheet(sheetName)
sheet.write(row, col, result)#写入数据
cwb.save(excelPath) #保存数据
wb.close()#关闭Excel
4、调用封装的Excel类,并执行回写方法,可根据需求把返回信息和测试结果写进Excel指定表单的指定列
import unittest
from Utils.page import *
from excels import Excels
from page import Helper
import warnings
from ddt import *
from excel_read_ddt import *
#用ddt读取excle表格
filepath = r'D:Pythonddtdata.xlsx'
login = ExcelUtil(filepath,sheetName = "login").dict_data()
@ddt()
class TestSolution(unittest.TestCase, Helper, ExcelUtil,Excels):
# 添加装饰器-前置条件环境准备
@classmethod
def setUpClass(cls):
warnings.simplefilter('ignore', ResourceWarning)
# 添加装饰器-后置条件进行关闭
@classmethod
def tearDownClass(cls):
pass
@data(*login)
def test_2_login(self,mydata):
"""登录接口"""
#准备测试数据,并获取实际结果,读取的结果是整列,遍历执行,有多少行就执行多少次用例
r = self.post(mydata['url'],json.loads(mydata['data']))
print("登录response:", r.json())
#断言
try:
self.assertEqual(json.loads(mydata['expected1']), r.status_code)
self.assertEqual(int(mydata['expected2']), r.json()['code'])
self.assertIn(mydata['expected'], r.json()['message'])
self.mylog("接口断言:登录接口响应状态码检验")
TestResult = 'PASS'
print('执行用例成功!')
except Exception as e:
#用例执行失败后捕获异常并处理,最终抛出异常
TestResult = 'Failed'
print('执行用例出错:{0}'.format(e))
raise e
#不管是否执行成功,均要把相应的测试结果写入Excel
finally:
ExcelUtil.write_back(filepath, "login", int(mydata['case_id']), 7, r.json()['message'])
ExcelUtil.write_back(filepath,"login",int(mydata['case_id']),8,TestResult)
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码