Pytest集成excel

2.10.1 反射函数

反射函数概念:它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法:
• getattr 获取指定字符串名称的对象属性
• setattr 为对象设置一个对象
• hasattr 判断对象是否有对应的对象(字符串)
• delattr 删除指定属性
在数据驱动中使用的是getattr方法,通过读取excel表格的数据确定关键字和参数,执行对应的代码。先看下语法:

func=(obj,method_name)
func(*args)
obj:关键字类对象
method_name:关键字方法
args:方法中需要的参数

示例:

class A:
    def func1(self):
        print("方法一")
    def func2(self,a:str=''):
        print("方法2"+a)
    def func3(self,a,b):
        print("两数之和为"+str(a+b))
#创建A类的对象
a=A()
method=input("请输入方法名")
params=input("请输入参数")
try:
    f=getattr(a,method)
except:
    print("方法不存在")
if params:
    f(*params)
else:
	f()

结果:

请输入方法名func2
请输入参数1
方法21

2.10.2 原始数据驱动

1.excel方法
需要安装的python库:
openpyxl、xlrd、xlwt
Excel.py:根据文件结尾xlsx、xls,设置打开或写入excel的对象
NewExcel.py:文件结尾xlsx的excel文件处理方法
OldExcel.py:文件结尾xls的excel文件处理方法
说明:这三个文件不是我写的 这里我把原代码放出来就不上注释了 抱歉!
Excle.py文件内容:

import os
from common.excel import NewExcel
from common.excel import OldExcel



def get_reader(srcfile=''):

    reader = None

    if not os.path.isfile(srcfile):
        print("%s not exist!" % (srcfile))
        return reader

    if srcfile.endswith('.xls'):
        reader = OldExcel.Reader()
        reader.open_excel(srcfile)
        return reader

    if srcfile.endswith('.xlsx'):
        reader = NewExcel.Reader()
        reader.open_excel(srcfile)
        return reader


def get_writer(srcfile, dstfile):

    writer = None
    if not os.path.isfile(srcfile):
        print("%s not exist!" % (srcfile))
        return writer

    if srcfile.endswith('.xls'):
        writer = OldExcel.Writer()
        writer.copy_open(srcfile, dstfile)
        return writer

    if srcfile.endswith('.xlsx'):
        writer = NewExcel.Writer()
        writer.copy_open(srcfile, dstfile)
        return writer

NewExcle.py文件内容:

import os, openpyxl
from shutil import copyfile
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment, Protection



class Reader:


    def __init__(self):
        self.workbook = None
        self.sheet = None
        self.rows = 0
        self.r = 0

    # 打开excel
    def open_excel(self, srcfile):
        if not os.path.isfile(srcfile):
            print("%s not exist!" % (srcfile))
            return

        openpyxl.Workbook.encoding = "utf8"
        self.workbook = openpyxl.load_workbook(filename=srcfile)
        self.sheet = self.workbook[self.workbook.sheetnames[0]]
        self.rows = self.sheet.max_row
        self.r = 0
        return

    def get_sheets(self):
        sheets = self.workbook.sheetnames
        return sheets

    def set_sheet(self, name):
        self.sheet = self.workbook[name]
        self.rows = self.sheet.max_row
        self.r = 0
        return


    def readline(self):

        lines = []

        for row in self.sheet.rows:

            line = []

            for cell in row:
                if cell.value is None:
                    line.append('')
                else:
                    line.append(cell.value)

            lines.append(line)

        return lines


class Writer:

    def __init__(self):

        self.workbook = None

        self.wb = None

        self.sheet = None

        self.df = None

        self.row = 0

        self.clo = 0

    def copy_open(self, srcfile, dstfile):
    
        if not os.path.isfile(srcfile):
            print(srcfile + " not exist!")
            return

        if os.path.isfile(dstfile):
            print(dstfile + " file already exist!")

        self.df = dstfile

        self.workbook = openpyxl.load_workbook(filename=srcfile)

        copyfile(srcfile, dstfile)

        self.wb = openpyxl.load_workbook(filename=dstfile)
        return


    def get_sheets(self):

        sheets = self.workbook.sheetnames
        return sheets


    def set_sheet(self, name):

        self.sheet = self.wb[name]
        return


    def write(self, r, c, value, color=None):

        d = self.sheet.cell(row=r + 1, column=c + 1, value=value)

        if color:
            if color == 0:
                color = "FF000000"
            elif color == 1:
                color = "FFFFFFFF"
            elif color == 2:
                color = "FFFF0000"
            elif color == 3:
                color = "FF00FF00"
            elif color == 4:
                color = "FF0000FF"
            elif color == 5:
                color = "FFFFFF00"
            else:
                color = "FF000000"

        font = Font(name='Arial',
                    size=11,
                    bold=False,
                    italic=False,
                    vertAlign=None,
                    underline='none',
                    strike=False,
                    color=color)

        d.font = font
        return

    def save_close(self):
        self.wb.save(self.df)
        return

OldExcle.py文件内容:


import os, xlrd, xlwt
from xlutils.copy import copy

class Reader:
    def __init__(self):
        self.workbook = None
        self.sheet = None
        self.rows = 0
        self.r = 0

    def open_excel(self, srcfile):
        if not os.path.isfile(srcfile):
            print("%s not exist!" % (srcfile))
            return

        xlrd.Book.encoding = "utf8"

        self.workbook = xlrd.open_workbook(filename=srcfile)
        self.sheet = self.workbook.sheet_by_index(0)
        self.rows = self.sheet.nrows
        self.r = 0
        return

    def get_sheets(self):
        sheets = self.workbook.sheet_names()
        return sheets

    def set_sheet(self, name):
        self.sheet = self.workbook.sheet_by_name(name)
        self.rows = self.sheet.nrows
        self.r = 0
        return

    def readline(self):
        lines = []
        while self.r < self.rows:
            row1 = None
            row = self.sheet.row_values(self.r)
            self.r = self.r + 1
            i = 0
            row1 = row
            for strs in row:
                row1[i] = str(strs)
                i = i + 1
            lines.append(row1)

        return lines


class Writer:

    def __init__(self):
        self.workbook = None
        self.wb = None
        self.sheet = None
        self.df = None
        self.row = 0
        self.clo = 0
    def copy_open(self, srcfile, dstfile):
        if not os.path.isfile(srcfile):
            logger.error(srcfile + " not exist!")
            return
        if os.path.isfile(dstfile):
            print(dstfile + " file already exist!")

        self.df = dstfile
        self.workbook = xlrd.open_workbook(filename=srcfile, formatting_info=True)
        self.wb = copy(self.workbook)
        return

    def get_sheets(self):
        sheets = self.workbook.sheet_names()
        return sheets

    def set_sheet(self, name):
        self.sheet = self.wb.get_sheet(name)
        return

    def write(self, r, c, value, color=None):
        def _getCell(sheet, r, c):

            row = sheet._Worksheet__rows.get(r)
            if not row:
                return None

            cell = row._Row__cells.get(c)
            return cell

        cell = _getCell(self.sheet, r, c)
        if cell:
            idx = cell.xf_idx

        if color is None:
            self.sheet.write(r, c, value)
            if cell:
                ncell = _getCell(self.sheet, r, c)
                if ncell:
                    ncell.xf_idx = idx

        else:
            style = xlwt.XFStyle()
            font = xlwt.Font()  
            font.name = 'Arial'
            font.bold = True  
            # font.underline = True  
            # font.italic = True 
            font.colour_index = color 
            style.font = font
            borders = xlwt.Borders()
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top = xlwt.Borders.THIN
            borders.bottom = xlwt.Borders.THIN
            style.borders = borders
            self.sheet.write(r, c, value, style)

        return
    def save_close(self):
        self.wb.save(self.df)
        return

2.读取excel用例,执行用例,将结果写入excel
用例内容:在这里插入图片描述

示例代码:
#关键字对象
web=Web()
def runcase(obj,line,i):
    """
    :param obj:关键字对象
    :param line:参数
    :param i: 写入的行
    :return:
    """
    #思路,先判断哪一行是要进行反射的,
    #如果第一个或者第二个有值则不执行反射
    print(line)
    if len(line[0])>1 or len(line[1])>1:
        return
    try:
        func=getattr(obj,line[3])
        print(line[3])
        writer.write(i,7,"PASS",3)
    except Exception as e:
        print('关键字%s不存在' % line[3])
        writer.write ( i, 7, "FALl", 2 )
        return

    params=line[4:]
    params=params[:params.index('')]
    if params:
        func(*params)
    else:
        func()
#打开文件
reader=get_reader("../lib/电商项目用例.xlsx")
#写入文件
writer=get_writer("../lib/电商项目用例.xlsx","../lib/result-电商项目用例.xlsx")
#获取内容,获取sheet页 然后输出每一个sheet页每一行的数据,在把每一行的数据进行遍历
#调用get_sheets方法调用
#执行成功写入pass
sheets=reader.get_sheets()
for i in range (0,len(sheets)):
    #遍历sheets名称,挨个读取
    reader.set_sheet(sheets[i])
    #保证读取和写入都在同一个sheet页
    writer.set_sheet(sheets[i])
    lines=reader.readline()
    #输出每一行的信息
    for i in range(1,len(lines)):
        runcase(web,lines[i],i)

#保存结果
writer.save_close()

2.10.3 pytest集成excel

思路:将excel中的用例保存到列表cases中,使用pytest参数化调用cases,再用反射的方式执行cases。就实现了excel驱动pytest。
代码供参考:

保存用例到cases:


class Conf:
    def __init__(self,reader_path="./../lib/电商项目用例.xlsx",writer_path="./../lib/result-电商项目用例.xlsx"):
    #读取excel文件
        self.reader=get_reader(reader_path)
        #self.writer=get_writer(reader_path,writer_path)
    #获取sheet名称
        self.sheetname=self.reader.get_sheets()
    #设置cases 保存所有用例
        self.cases=[]

        self.get_Case()


    def get_Case(self):
        #设置要读取的sheet页
        for i in range(0,len(self.sheetname)):
            self.reader.set_sheet(self.sheetname[i])
            case=[]
            #读取行
            lines=self.reader.readline()
            for i in range (1,len(lines)):
                line=lines[i]
                # 如果一个数据有值 我们不做任何操作
                if  len(line[0])>1:
                    pass
                #如果第二个数据有值我们开始保存case,这是一个case的开始   登录失败的用例
                elif len(line[1])>1:
                    #如果不是第一行 到了第二个用例的时候
                    if i >2 :
                        #我们要把上一个用例保存到cases里面
                        self.cases.append(case)
                        #将case置空保存第二条用例
                        case=[]
                    case.append(line)
                #如果没有值 就直接在case后面增加,直到下一次 len(line[1])>1
                else:
                    case.append(line)
            #把最后一个用例保存到cases
            self.cases.append(case)
        #输出case
        # for i  in  range (0,len(self.cases)):
        #     print(self.cases[i])

conf=None

用例部分代码:

class Test_web():
    """web自动化测试类"""

    def setup_class(self):
        self.web=Web()

    allure.step()

    @pytest.mark.parametrize("case_params",excel_conf.conf.cases)
    def test_case(self,case_params):
        for i  in range (0,len(case_params)):
            line=case_params[i]
            #判断那行执行
            if len(line[0]) > 1 or len(line[1]) > 1:
                continue
            #获取一行的数据
            try:
                func =getattr(self.web,line[3])
                params = line[4:]
                params = params[:params.index('')]
                func(*params)
            except:
                print(line[3]+"方法不存在")

if __name__=='__main__':
    excel_conf.conf=Conf()
    os.system('rd /s/q result')
    os.system('rd /s/q reports')
    pytest.main(['-s', 'pytest_example/test_web.py','--alluredir', 'result'])
    os.system('allure generate result -o reports --clean')

再使用pytest生成allure报告,这里就不介绍allure的设计了(我比较懒)。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: pytest是Python的一种单元测试框架,可以用来编写和运行测试用例。它提供了丰富的装饰器和断言方法,使得编写测试用例变得更加简单和高效。 requests是Python的一个库,用于向网络发送HTTP请求。它提供了简洁而直观的API,可以方便地进行GET、POST、DELETE等请求的发送,并可以处理返回结果。 excel是一种电子表格工具,可以用来整理和存储数据。在测试中,我们可以使用excel来保存测试数据或者测试结果,方便查看和分析。 allure是一个开源的测试报告生成工具,它可以用来生成美观而且详细的测试报告。通过集成pytest和allure,我们可以在运行测试用例时自动生成漂亮的HTML报告,方便查看测试结果和问题定位。 综上所述,pytest、requests、excel和allure在测试领域有着各自的作用。pytest用于编写和运行测试用例,requests用于发送HTTP请求,excel用于存储测试数据和结果,allure用于生成漂亮的测试报告。它们的结合使用可以提高测试的效率和可视化程度,从而更好地进行软件测试工作。 ### 回答2: pytest是一种Python的测试框架,可以帮助我们编写和执行测试代码。requests是一个常用的Python库,用于发送HTTP请求,可以方便地与Web服务进行交互。excel是一种电子表格软件,常用于存储和管理大量数据。allure是一个测试报告生成工具,可以根据pytest的执行结果生成漂亮且易读的HTML报告。 结合这几个工具,我们可以实现以下功能: - 使用pytest框架编写接口测试代码,可以方便地管理和执行测试用例。 - 通过requests库发送请求,可以模拟用户与Web服务的交互,验证接口的正确性和稳定性。 - 使用excel存储测试数据,可以灵活地管理和修改测试数据,方便测试代码的维护和复用。 - 利用pytest和requests结合,可以进行接口测试,验证接口的返回结果是否符合预期。 - 使用allure生成漂亮的测试报告,可以直观地查看测试结果、错误日志和测试覆盖率等信息,便于开发人员和测试人员的交流和问题排查。 总之,结合pytest、requests、excel和allure这几个工具,我们可以实现高效且可维护的接口测试,并生成易读的测试报告,帮助我们更好地开展测试工作。 ### 回答3: pytest是一个Python的测试框架,可以用于编写并运行各种类型的自动化测试。requests是一个常用的HTTP库,可以方便地发送HTTP请求。excel是一种电子表格文件格式,可以用来存储数据。allure是一个用于生成漂亮测试报告的工具。 在使用pytest进行接口测试时,我们可以使用requests库发送HTTP请求,并通过断言来验证接口的返回结果是否符合预期。可以使用pytest的fixture功能来初始化请求所需的参数,以及在每个测试用例执行前后进行相应的操作。 如果我们需要使用excel来管理接口测试数据,可以使用第三方库如openpyxl来读取和写入excel文件。这样,我们可以将测试用例的输入数据和预期结果存储在excel表格中,然后在测试脚本中读取这些数据,并在测试用例中使用。 在测试完成后,使用allure可以生成漂亮的测试报告。allure支持在测试脚本中插入一些注解,来给测试报告添加额外的信息,如测试用例的描述、优先级、标签等。这些信息会在生成的报告中呈现出来,使得测试报告更加详尽和易读。 综上所述,使用pytest结合requests、excel和allure可以实现一个完整的接口测试框架。pytest提供了丰富的功能和灵活的配置,requests可以方便地发送HTTP请求,excel可以用来管理测试数据,allure可以生成漂亮的测试报告。这些工具的结合,可以提高我们编写和执行接口测试的效率,并且让测试报告更加直观和详细。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷雨飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值