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条用例,通过一条,跳过一条,失败一条