Python ddt数据驱动使用,跳过用例操作

excel数据准备

test.xlsx
在这里插入图片描述
字段说明
case_name:用例名称,可以在后续报告中使用
case_describe:描述,可以在后续报告中使用
number:准备测试的数据
expected_result:预测结果
actual_result:实际返回结果,后续可写入到excel中
pass_or_faul:用例测试结果,后续可写入到excel中
isRun:是否测试此条用

代码准备

operate_excel.py

import openpyxl
import log


class ReadExcel:
    """读取 excel 用于 ddt 数据驱动"""
    def __init__(self, excel_path, sheet_name='Sheet1'):
        self.data = openpyxl.load_workbook(excel_path)
        try:
            self.sheet = self.data[sheet_name]
        except BaseException:
            self.sheet = self.data.active
        self.keys = [row1.value for row1 in tuple(self.sheet.rows)[0]]
        self.max_row = self.sheet.max_row
        self.max_col = self.sheet.max_column
        self.log = log.Log()

    def dict_data(self):
        if self.max_row < 2:
            self.log.debug('excel max row  < 2, Verify excel accuracy')
        else:
            case_data = []
            for i in range(self.max_row - 1):
                case_dict = {'row_num': i + 2}
                for j in range(self.max_col):
                    case_dict[self.keys[j]] = self.sheet.cell(i + 2, j + 1).value
                case_data.append(case_dict)
                i += 1
            return case_data


class WriteExcel:
    """记录结果至 excel"""
    def __init__(self, excel_path, sheet_name='Sheet1'):
        self.data = openpyxl.load_workbook(excel_path)
        self.excel_path = excel_path
        try:
            self.sheet = self.data[sheet_name]
        except BaseException:
            self.sheet = self.data.active

    def write(self, row, column, message):
        self.sheet.cell(row, column, message)
        self.data.save(self.excel_path)


if __name__ == '__main__':
    excel_path = r'E:\common\test\test.xlsx'
    sheet_name = 'Sheet1'
    read_excel = ReadExcel(excel_path, sheet_name)
    case_data = read_excel.dict_data()
    print(case_data)
	# write_data = WriteExcel(excel_path, sheet_name)
    # write_data.write(2, 4, 'Y')


使用operate_excel.py读取上述excel数据会生成如下列表,后续使用在ddt.data中

[{'row_num': 2, 'case_name': 'add_1', 'case_describe': 'pass', 'number': '1,2', 'expected_result': 3, 'actual_result': None, 'pass_or_fail': None, 'isRun': 'Y'}, 
 {'row_num': 3, 'case_name': 'add_2', 'case_describe': 'skip', 'number': '3,4', 'expected_result': 7, 'actual_result': None, 'pass_or_fail': None, 'isRun': 'n'}, 
 {'row_num': 4, 'case_name': 'add_3', 'case_describe': 'fail', 'number': '5,6', 'expected_result': 11, 'actual_result': None, 'pass_or_fail': None, 'isRun': 'Y'}]

ddt_use.py

import os
import shutil
import time
import unittest
import ddt
import log
import operate_excel
from BeautifulReport import BeautifulReport


# 拷贝一个原 excel,稍后将测试结果写入新的 excel
time_dst = time.strftime('%Y%m%d%H%M%S')
src_excel = r'E:\common\test\test.xlsx'
dst_excel = os.path.join(r'E:\common\result', 'test1' + time_dst + '.xlsx')
test_data = operate_excel.ReadExcel(src_excel, 'Sheet1').dict_data()    
shutil.copy(src_excel, dst_excel)

# 引入 log 模块记录 log,这里 log 是二次封装的模块,不调用也没有问题
Logging = log.Log()


# 测试对象,一个加法
def add(a, b):
    s = int(a) + int(b)
    return s


@ddt.ddt
class Add(unittest.TestCase):
    @ddt.data(*test_data)
    def test_add(self, data):
        is_run = data['isRun']
        # 检测 isRun,是否跳过此条用例
        if is_run == 'Y' or is_run == 'y':
            row_num = data['row_num']
            number = data['number'].split(',')
            expected_result = data['expected_result']
            # 将测试数据传入测试对象,返回结果并校验,然后将测试结果写入新 excel
            s = add(number[0], number[1])
            if s == int(expected_result):
                flage = True
            else:
                flage = False
            if flage:
                Logging.debug('add success')
                operate_excel.WriteExcel(dst_excel).write(row_num, 5, s)
                operate_excel.WriteExcel(dst_excel).write(row_num, 6, 'Pass')
            else:
                Logging.debug('add fail')
                operate_excel.WriteExcel(dst_excel).write(row_num, 5, s)
                operate_excel.WriteExcel(dst_excel).write(row_num, 6, 'Fail')
            self.assertTrue(flage, msg='check data')
        else:
        	# 跳过
            self.skipTest('skip')


if __name__ == '__main__':
    # unittest.main()
    test_suite = unittest.defaultTestLoader.discover(
        r'E:\common', pattern='ddt_use.py')
    result = BeautifulReport(test_suite)
    time_str = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
    result.report(filename='测试报告' + time_str, description='测试报告')

执行后的报告

执行3条用例,通过一条,跳过一条,失败一条
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值