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中

posted @ 2019-12-24 13:57  DesireYang  阅读(945)  评论(0编辑  收藏  举报