unittest测试框架之DDT数据驱动
ddt的使用
DDT数据驱动
- DDT:Data Driver Test(数据驱动测试)
 
- 数据驱动思想:数据和用例进行分离,通过外部数据去生成测试用例
 
安装
pip install ddt
修改ddt源码(是为了在生成的测试报告中显示每条用例所对应的标题title)
- ddt文件中的ddt()方法
 
- 把原来的test_data_docstring = _get_test_data_docstring(func, v)注释掉
 
- 如果数据是用对象来保存的,就添加test_data_docstring = v.title
 
- 如果数据使用字典来保存的,就添加test_data_docstring = v["title"]
 
- 修改后生成的测试报告就能把title列显示到测试报告中
 
- 注意: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
@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中
