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
分享
二维码
< <上一篇
下一篇>>