阅读 10

Python3测试脚本与测试数据分离Openpyxl+DDT

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

1.什么是ddt?它有什么作用?

  • ddt : data driver test 数据驱动测试
  • 测试步骤与测试数据分离,提高代码复用性,只需要维护数据文件,即测试用例即可;

2.@unpack装饰器的作用?

  • 即对@data解析后的可迭代元素(数据)再一次解包,但是不能对已经是单个存在的元素再次解包
  • @data装饰器的使用规则
    • 可传入元组、字典、列表等复杂结构的可迭代数据数据

4.将之前写的两数相除的单元测试,使用ddt进行第一次重构

import unittest
import inspect
from collections import namedtuple in
from ddt import ddt, data,unpack
from openpyxl import  load_workbook
from python_common.practice.Calculator import Calculator

wb=load_workbook(r"D:\python_study\python_common\practice\test.xlsx")
ws=wb.active

sheet_head_tuple = tuple(ws.iter_rows(min_row=1,values_only=True))[0]
# 输出元组
# print(sheet_head_tuple)

cases_list = []
Cases = namedtuple("cases",sheet_head_tuple)   # 创建一个元组类
for data1 in ws.iter_rows(min_row=2, values_only=True):  # 每次遍历,返回由某行所有单元格值组成的一个元组
# 命名规则规范*data会覆盖ddt.data的功能,所以要区分,否则*data就是个元素
    cases_list.append(Cases(*data1))

# 命名元组获取参数的值
# print(cases_list[1].case_id)

@ddt
class DDT_Test_Div(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        """
        在所有用例执行之前会被执行
        :return:
        """
        print("\n{:=^40s}".format("开始执行用例"))

    @classmethod
    def tearDownClass(cls):
        """
        所有用例执行之后,会被调用一次,保存结果文件
        :return:
        """
        print("{:=^40s}".format("用例执行结束"))
        wb.save(r"D:\python_study\python_common\practice\test.xlsx")

    # @unpack
    @data(*cases_list)
    def test_div(self,data_namedtuple):

        case_id = data_namedtuple.case_id
        msg = data_namedtuple.title
        l_data = data_namedtuple.l_data
        r_data = data_namedtuple.r_data
        expected = data_namedtuple.expected

        print("\n日志记录执行测试用例的方法: {}".format(inspect.stack()[0][3]))
        # 获取两个数相除的实际结果
        real_result = Calculator(l_data, r_data).division()
        # 将实际结果写入excel
        ws.cell(row=case_id+1, column=6, value=real_result)
        try:
            self.assertEqual(expected, real_result, msg="判断{}结果失败".format(msg))
        except AssertionError as e:
            print("输出具体异常信息:{}".format(e))
            # 将断言的结果写入文件
            ws.cell(row=case_id+1, column=7, value="Fail")
            raise e
        else:
            # 将断言的结果写入文件
            ws.cell(row=case_id + 1, column=7, value="Pass")

if __name__ == '__main__':
    unittest.main()

复制代码
文章分类
后端
文章标签