zoukankan      html  css  js  c++  java
  • unittest测试框架之DDT数据驱动

    unittest测试框架之DDT数据驱动

    ddt的使用

    DDT数据驱动

    • DDT:Data Driver Test(数据驱动测试)
    • 数据驱动思想:数据和用例进行分离,通过外部数据去生成测试用例

    安装

    pip install ddt
    

    修改ddt源码(是为了在生成的测试报告中显示每条用例所对应的标题title)

    1. ddt文件中的ddt()方法
    2. 把原来的test_data_docstring = _get_test_data_docstring(func, v)注释掉
    3. 如果数据是用对象来保存的,就添加test_data_docstring = v.title
    4. 如果数据使用字典来保存的,就添加test_data_docstring = v["title"]
    5. 修改后生成的测试报告就能把title列显示到测试报告中
    6. 注意:title要是Excel表中的列名
    def ddt(cls):
        for name, func in list(cls.__dict__.items()):
            if hasattr(func, DATA_ATTR):
                for i, v in enumerate(getattr(func, DATA_ATTR)):
                    test_name = mk_test_name(name, getattr(v, "__name__", v), i)
                    # test_data_docstring = _get_test_data_docstring(func, v) # 原来的
                    # test_data_docstring = v.title  # 数据使用对象来保存,改成这样
                    test_data_docstring = v["title"]  # 数据使用字典来保存,改成这样
                    if hasattr(func, UNPACK_ATTR):...
                    else:
                        add_test(cls, test_name, test_data_docstring, func, v)
                delattr(cls, name)
            elif hasattr(func, FILE_ATTR):...
        return cls
    

    在测试类中使用ddt数据驱动获取数据(这时一个测试用例类只需要一个测试方法就可以)

    先准备一个简单的登陆功能函数

    def login(name=None, pwd=None):
        if name and pwd:
            if name == "desire" and pwd == "123456":
                return {"code": 0, "msg": "登陆成功"}
            else:
                return {"code": 1, "msg": "账号密码错误"}
        else:
            return {"code": 1001, "msg": "不能有空值"}
    

    准备excel测试用例表格

    导入ddt模块

    from ddt import ddt, data
    

    创建测试用例类,加上ddt装饰器@ddt

    读取excel表格ReadExcel

    @ddt
    class LoginTestCase(unittest.TestCase):
        # DATA_DIR:测试用例存放的路径,用os模块进行拼接excel用例表格的路径
        excel_path = os.path.join(DATA_DIR, 'cases.xlsx')
        login = ReadExcel(excel_path, "login")
        # 读取数据(字典形式)
        login_datas = login.read_data_dict()
        # 读取数据(类的形式)
        # login_datas = login.read_data_obj()
    

    创建测试用例方法,加上ddt装饰器@data

    @data()里面传的参数要进行拆包,把每次的数据传到方法里case参数
        @data(*login_datas)
        def test_login(self, case):
            pass
    
    第一步:准备用例数据
    ①:字典形式取值(使用时需要修改ddt源文件为字典形式)
            # 1.参数
            login_data = eval(case["data"])
            # 2.预期结果
            expected = eval(case["expected"])
            # 3.用例序号
            case_id = case["case_id"]
    
    ②:类形式取值(使用时需要修改ddt源文件为类形式)
            # 1.参数
            login_data = eval(case.data)
            # 2.预期结果
            expected = eval(case.expected)
            # 3.用例序号
            case_id = case.case_id
    
    第二步:执行功能函数,获取实际结果
            result = login(*login_data)
    
    第三步:通过断言比对预期结果和实际结果
            try:
                self.assertEqual(expected, result)
            except AssertionError as a:
                # 把用例未通过结果写入excel中(调用[ReadExcel](https://www.cnblogs.com/desireyang/p/12059916.html)类中的写入方法)
                self.login.write_data(row=case_id + 1, column=5, value="用例未通过")
                raise a
            else:
                self.login.write_data(row=case_id + 1, column=5, value="用例通过")
    
    直接可以运行测试用例类,会把自动化测试结果写入到excel中

  • 相关阅读:
    Spring ( 二 ) IOC 依赖注入
    爬虫常见问题与解答
    Python Json模块中dumps、loads、dump、load函数介绍
    生成器和迭代器和可迭代对象
    生成器(generator)
    可迭代对象(Iterable)和迭代器(Iterator)
    Google 的 Java 编码规范,参考学习!
    HTML5和css3的总结四
    3d照片环效果(修改版--添加了x轴y轴双向转动和修复模糊度的bug)
    css3新属性的总结
  • 原文地址:https://www.cnblogs.com/desireyang/p/12091154.html
Copyright © 2011-2022 走看看