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中