数据驱动之Excel读写

38 篇文章 6 订阅
23 篇文章 0 订阅
该博客介绍了一个Python自动化测试框架的实现,包括从Excel读取测试用例,使用Py文件作为数据驱动,配置日志记录,并定义了不同测试结果的样式。主要涉及openpyxl库用于Excel操作,以及logging配置文件来管理和输出日志。
摘要由CSDN通过智能技术生成


1.Excel内容

路径下的文件

路径下的文件

Sheet1

Sheet1内容

Sheet2

Sheet2

2.Py文件数据驱动

class DataDriver:
    NAME = 'xuzhu'
    AGE = '16'
    ADDRESS = '汤臣一品'

if __name__ == '__main__':
    print(DataDriver.NAME)

3.log.ini

[loggers]
keys=root

[handlers]
keys=fileHandler,streamHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=INFO
handlers=fileHandler,streamHandler

[handler_fileHandler]
class=FileHandler
level=INFO
formatter=simpleFormatter
args=('mylog.log','a','utf-8')

[handler_streamHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter



[formatter_simpleFormatter]
format=%(asctime)s %(filename)s %(levelname)s  %(funcName)s  %(message)s

4.生成日志器的配置

'''
    生成日志器的配置
'''
import logging.config


# 路径一定要在调用的地方进行填写,不然会报错。
def get_log(path):
    logging.config.fileConfig(path)
    return logging.getLogger()

5.用于配置excel的写入格式内容

'''
    用于配置excel的写入格式内容
        把断言的结果Pass和Failed更加突出一些
        PatternFill类用于定义颜色
        Font类用于定义格式
'''

from openpyxl.styles import Alignment
from openpyxl.styles import Font
from openpyxl.styles import PatternFill


# pass的写入配置
def pass_(cell,row,column):
   cell(row=row, column=column).value = 'Pass'

   # 单元格显示: 绿色加粗
   cell(row=row, column=column).fill = PatternFill('solid',fgColor='AACF91')
   cell(row=row, column=column).font = Font(bold = 'True')
   cell(row=row, column=column).alignment = Alignment(horizontal='center', vertical='center')


# Failed写入配置
def failed(cell,row,column):
   cell(row=row, column=column).value = 'Failed'

   # 单元格显示: 红色加粗
   cell(row=row, column=column).fill = PatternFill('solid',fgColor='FF0000')
   cell(row=row, column=column).font = Font(bold = 'True')
   cell(row=row, column=column).alignment = Alignment(horizontal='center', vertical='center')

6.excel文件读取类,用于实现测试用例文件的读取与执行


'''
    excel文件读取类,用于实现测试用例文件的读取与执行
'''
import pathlib

import openpyxl

from class25.excel_driver import excel_conf
from class26 import log_conf

# 解析测试用例中测试参数单元格的内容,并转换为字典的形态返回
from class24.web_keys import Keys


def arguments(value):
    data = dict()
    # 如果value有值,进行切分
    if value:
        str_temp = value.split(';')
        for temp in str_temp:
            t = temp.split("=", 1)
            data[t[0]] = t[1]
    # 如果value没有值,就不做任何操作
    else:
        # data = None
        pass
    return data

# 获取当前路径,并切换到excel路径下,pathlib.Path函数返回的
def path():
    file = pathlib.Path(__file__).resolve().parents[1] / 'data/自动化测试用例demo.xlsx'
    return file

# 获取指定的测试用例文件,进行自动化执行。
def read(file,log):
    # 获取log
    # log_file = pathlib.Path(__file__).resolve().parents[1] / '../class26/conf/log.ini'
    # log = log_conf.get_log(log_file)
    # 获取excel中的内容\
    # excel = openpyxl.load_workbook('../data/自动化测试用例demo.xlsx')
    # file = pathlib.Path(__file__).resolve().parents[1] / 'data/自动化测试用例demo.xlsx'
    excel = openpyxl.load_workbook(file)

    # 失败用例集合
    failed_cases = list()
    # 定义统计数据
    passed = 0
    failed = 0

    # sheet = excel['Sheet1']
    # 获取所有的sheet页,来执行里面的测试内容
    for name in excel.sheetnames:
        sheet = excel[name]
        # print('*************正在执行{}Sheet页***************'.format(name))
        log.info('*************正在执行{}Sheet页***************'.format(name))
        try:
            for values in sheet.values:
                # 获取测试用例的正文内容
                if type(values[0]) is int:
                    # 用例描述可以用于日志的输出
                    # print('***********************正在执行:{}******************************'.format(values[3]))
                    log.info('***********************正在执行:{}******************************'.format(values[3]))
                    # print(values)
                    # 参数的处理:通过一个dict来接收所有的参数内容,便于定值不定长的传参形态
                    # 参数最终形态:'type_ = Chrome' 改变为 {type_: 'Chrome'}
                    # print(values[2])
                    data = arguments(values[2])
                    # print(data)
                    # print(str_temp)
                    '''
                     调用的函数values[1],这是固定的。
                        操作行为的调用分为以下几种不同类型:
                            1.实例化
                            2.基于实例化对象进行的操作行为
                            3.断言机制:有预期与实际的对比,以及有单元格测试结果的写入
                    '''

                    '''
                    第一行open_browser
                    第二行open:getattr(key,'open')(**data)
                                key.open(**data)
                                key.open(url = 'http://www.baidu.com')
                    第三行input:getattr(key,'open')(**data)
                                key.input(**data)
                                key.input(by='id',value='kw',txt='虚竹的excel')
                    第四行click
                   '''
                    # 实例化操作
                    if values[1] == 'open_browser':
                        key = Keys(**data)

                    # 断言行为:基于断言的返回结果来判定测试的成功失败,并进行写入操作
                    elif 'assert' in values[1]:
                        status = getattr(key, values[1])(expected=values[4],**data)
                        #基于status判定写入的测试结果
                        if status:
                            excel_conf.pass_(sheet.cell,row=values[0]+2,column=6)
                            passed+=1
                        else:
                            excel_conf.failed(sheet.cell,row=values[0]+2,column=6)
                            failed+=1
                            failed_cases.append(sheet)
    # 保存Excel:放在这里以确保每一次写入都可以被保存,避免因为代码报错而未保存之前的测试结果
                        excel.save(file)
                    # 常规操作行为
                    else:
                        # if data:
                        #     getattr(key,values[1])(**data)
                        # else:
                        #     getattr(key,values[1])()

                        getattr(key, values[1])(**data)
        except:
            failed+=1


    excel.close()
    sum_=passed+failed
    log.info('**************执行完毕*******************')
    log.info('本次总计执行{0}条用例,成功{1}条,失败{2}条,通过率为{3}'.format(sum_,passed,failed,100*passed/sum_))
    if len(failed_cases)>0:
        failed_cases.insert(0,file)
        return failed_cases
    return None

#reRun函数进行重跑
def rerun(case):
    excel = openpyxl.load_workbook(case[0])
    #用例的运行
    for sheet in case:
        for values in sheet.values:
            #用例的执行

7.main函数

import os

from class25.excel_driver.excel_read import path, read
from class26 import log_conf

if __name__ == '__main__':
    # 创建log对象
    log = log_conf.get_log('./conf/log.ini')
    # 通过读取data路径下是否有测试用例,有,就执行,没有就不执行
    # 重跑集合
    repeat = list()
    # 测试用例集合
    cases = list()
    # 读取路径下的测试用例
    for path,dir,files in os.walk('../class25/data/'):
        for file in files:
            # 获取文件的后缀名
            file_type = os.path.splitext(file)[1]
            # file_name = os.path.split(file)[1]
            file_name = os.path.splitext(file)[0]
            # print(file_type)
            # print(path+file)
            if file_type == '.xlsx':
                # print(file_type)
                if 'old' not in file_name:
                    case_path = path+file
                    cases.append(case_path)
            else:
                log.error('文件类型错误:{}'.format(file))
    for case in cases:
        log.info('********正在执行{}文件*********'.format(case))
        f = read(case,log)
        if f:
            repeat.append(f)

    if len(repeat)>0:
        #调用重跑,运行repeat下的所有用例
        pass

8.运行结果

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

司小幽

真诚赞赏,手留余香。

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

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

打赏作者

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

抵扣说明:

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

余额充值