保存数据的方法:
从Excel中读取测试数据后,还应该保存读取到的数据,以便后续使用:
一:先创建一个Excel文件,然后输入测试数据:
二:基础面向对象的原则,我们先写个通用的从Excel读取测试数据的类和方法:
1.写一个 DoExcel 类,在创建对象时需传入遥操作的Excel文件名和表单名;
2. 在类中写一个 get_excel 函数,该函数可以从Excel中读取数据;
3. 再写个 write_excel 函数,该函数可以将测试结果写入Excel,留着备用;
3.保存数据可以用列表、字典或者对象都行,这里只演示字典保存的方法,其他的可以自己拓展;
4.当我们需要从Excel中读取测试数据时,只要创建个 DoExcel('excel_name', 'sheet_name')的对象,并且传入你要读取的文件名和表单名,就可以得到保存在列表中的字典格式的测试数据,列表中的每个字典,都可以生成一条测试用例;
class DoExcel:
"""操作Excel"""
def __init__(self, excel_name, sheet_name):
self.excel_name = excel_name
self.sheet_name = sheet_name
def get_excel(self): # 从Excel读取测试数据
'''创建个列表,用来保存数据'''
data_list = []
wb = openpyxl.load_workbook(self.excel_name)
sheet = wb.get_sheet_by_name(self.sheet_name)
'''读取每一行的 case_id、a、b、expect组成键值对'''
for i in range(2, sheet.max_row+1):
'''创建个空字典,用来保存数据'''
data_dict = {}
'''将读取到的值和对应的表头名组成键值对,存入空字典 data_dict 中'''
data_dict['case_id'] = sheet.cell(i,1).value
data_dict['a'] = sheet.cell(i,2).value
data_dict['b'] = sheet.cell(i,3).value
data_dict['expect'] = sheet.cell(i,4).value
'''将保存了测试数据的字典添加进列表 data_list 中'''
data_list.append(data_dict)
'''返回保存了大量测试数据的列表 data_list 中'''
return data_list
'''需传入case_id result test_result'''
def write_excel(self,case_id, result, test_result):
wb = openpyxl.load_workbook(self.excel_name)
sheet = wb.get_sheet_by_name(self.sheet_name)
'''将测试结果写入对应的单元格中
result 在表单中的第5列,行数case_id+1;
test_result 在表单中的第6列,行数是 case_id+1'''
sheet.cell(case_id+1, 5).value = result
sheet.cell(case_id+1, 6).value = test_result
'''写入后必须保存'''
wb.save(self.excel_name)
使用读取到的测试数据生成并执行大量测试用例:
仍然使用之前的测试用例做示范,可以看到测试类共有4个位置参数,也就是我们需要传入4个参数:
import unittest
from class_13.math import Math
class TestMath(unittest.TestCase):
"""Math的测试类"""
"""首先我们增加个初始化函数,传入两个相加的数及预期结果,
并且用super()来调用父类的__init__()来初始化和传入用例名"""
def __init__(self, a, b, expect, methodName):
self.a = a
self.b = b
self.expect = expect
super(TestMath, self).__init__(methodName)
def test_add(self):
""""然后将加法测试用例的参数改为动态传参"""
result = Math(self.a, self.b).add()
self.assertEqual(result, self.expect)
print(f'{self.a}+{self.b}的结果是{self.expect}')
一:再写个执行测试用例的模块,以后执行测试用例都是来执行这个模块:
扫描二维码关注公众号,回复:
8693765 查看本文章
import unittest
import HTMLTestRunnerNew
from class_13.job.assignment_1229.common.do_excel import DoExcel
from class_13.job.assignment_1229.test_case.test_math import TestMath
'''读取 test_data.xlsx 中 Sheet 表单中的数据'''
doexcel = DoExcel("test_data.xlsx", 'Sheet')
test_data = doexcel.get_excel()
suite = unittest.TestSuite()
'''遍历列表中的字典,读取每个字典中的values,作为参数添加到测试用例中,每个字典生成一条测试用例,添加到测试套件 suite 中'''
for item in test_data:
case_id = item['case_id']
a = item['a']
b = item['b']
expect = item['expect']
suite.addTest((TestMath(case_id, a, b, expect, 'test_add')))
'''执行测试用例,生成测试报告'''
with open(r'E:\Pycharm\PyProjects\lemon\class_13\job\assignment_1229\test_report\测试报告.html', 'wb') as file:
runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file,
title='测试报告.html',
verbosity=2,
description='第一次执行测试报告',
tester='ChenXun')
runner.run(suite)
处理异常、写入测试结果:
执行测试用例时总有 assert 失败的时候,也要写入测试结果到Excel中,所以就需要我们做以下工作:
1. 改写测试用例,在用例断言时加入异常处理机制,否则会影响后后续用例的执行: try...except...
2. 异常处理完毕后要抛出异常,否则程序会认为用例执行通过:raise 抛出异常
3. 不管成功还是失败,都要将测试结果写入Excel中:finally
import unittest
from class_13.math import Math
class TestMath(unittest.TestCase):
"""Math的测试类"""
"""首先我们增加个初始化函数,传入两个相加的数及预期结果,
并且用super()来调用父类的__init__()来初始化和传入用例名"""
def __init__(self, a, b, expect, methodName):
self.a = a
self.b = b
self.expect = expect
super(TestMath, self).__init__(methodName)
def test_add(self):
result = Math().add(self.a, self.b)
try:
self.assertEqual(result, self.expect)
test_result = 'PASS'
except AssertionError:
test_result = 'FAILED'
raise
finally:
'''将实际结果和测试结果写入到对应 case_id 中'''
self.doexcel.write_excel(self.case_id, result, test_result)