《基于Python的全栈自动化测试》之 从Excel读取数据后保存数据、生成并执行测试用例、处理异常、写入测试结果

保存数据的方法:

    从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}')

一:再写个执行测试用例的模块,以后执行测试用例都是来执行这个模块:

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)


    END!!!

发布了44 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/waitan2018/article/details/85928964