ddt数据驱动测试

目的:使用ddt实现用例和测试数据分离处理
一、DDT简介
DDT——Data Driver Testting
可以实现根据你传进来的数据决定生成几个测试用例
使用pip install ddt完成安装
使用from ddt import ddt,data完成导入

二、DDT详解
1.ddt原理:
import unittest
from BeautifulReport import BeautifulReport
from interface_test.autotest_teach.py32_wuji_02day.last_homework.register import register
cases = [
{
'name': 'register_success',
'expected': {"code": 1, "msg": "注册成功"},
'actual_args': {'username': 'python32', 'password1': '123456', 'password2': '123456'}
},
{
'name': 'register_user_empty',
'expected': {"code": 0, "msg": "所有参数不能为空"},
'actual_args': {'username': '', 'password1': '123456', 'password2': '123456'}
},
{
'name': 'test_register_pwd1_empty',
'expected': {"code": 0, "msg": "所有参数不能为空"},
'actual_args': {'username': 'python', 'password1': '', 'password2': '123456'}
},
{
'name': 'test_register_pwd2_empty',
'expected': {"code": 0, "msg": "所有参数不能为空"},
'actual_args': {'username': 'python', 'password1': '123456', 'password2': ''}
},
{
'name': 'register_user_exist',
'expected': {"code": 0, "msg": "该账户已存在"},
'actual_args': {'username': 'lemon', 'password1': '123456', 'password2': '123456'}
},
{
'name': 'register_pwd1_not_pwd2',
'expected': {"code": 0, "msg": "两次密码不一致"},
'actual_args': {'username': 'bengpoba', 'password1': '123457', 'password2': '123456'}
},
{
'name': 'register_user_less6',
'expected': {"code": 0, "msg": "账号和密码必须在6-18位之间"},
'actual_args': {'username': 'wuji', 'password1': '123456', 'password2': '123456'}
},
{
'name': 'register_pwd_less6',
'expected': {"code": 0, "msg": "账号和密码必须在6-18位之间"},
'actual_args': {'username': 'peiqi', 'password1': '1234', 'password2': '1234'}
},
{
'name': 'register_user_grate18',
'expected': {"code": 0, "msg": "账号和密码必须在6-18位之间"},
'actual_args': {'username': 'jiuxianglaoshuaidami', 'password1': '1234567890123456789',
'password2': '1234567890123456789'}
},
{
'name': 'register_pwd_grate18',
'expected': {"code": 0, "msg": "账号和密码必须在6-18位之间"},
'actual_args': {'username': 'wuji', 'password1': '1234567890123456789', 'password2': '1234567890123456789'}
}
]

注意RegisterTestCase是一个空类

1. 定义一个方法, 构造一个通用的函数。

def make_test_func(expected, actual_args):
"""
构造测试用例方法。
:param expected: 预期结果
:param actual_args: 被测对象需要传递的参数
:return: 一个函数
"""
def test(self):
# 参数化: 把写死的值用变量代替(在方法里定义方法,返回方法)
self.assertEqual(expected, register(
actual_args), msg='预期结果和实际结果不相等,测试失败。')
return test

2. 遍历cases,通过步骤1定义的方法,自动生成 len(cases)个test_开头的方法,并把方法添加到

RegisterTestCase类中。

for case in cases:
name, expected, actual_args = case.values()
# 动态地生成函数
test_func = make_test_func(expected,**actual_args)
print(test_func)
# 把生成的函数添加到RegisterTestCase类中
print(dir(RegisterTestCase))
# setattr把一个函数添加到类中,第一个参数是要往哪个类添加,第二个是生成的函数名,第三个参数是添加什么函数(方法)
setattr(RegisterTestCase,'test_{name}'.format(name=name),test_func)
print(dir(RegisterTestCase))

3. 运行测试用例,生成报告

3.1 创建套件对象

suite = unittest.TestSuite()

3.2 创建一个加载器

loader = unittest.TestLoader()

3.3 加载测试用例

suite.addTest(loader.loadTestsFromTestCase(RegisterTestCase))

3.4 生成报告

br = BeautifulReport(suite)
br.report('注册自动化测试报告','myddt.html', report_dir='')

2.ddt的使用
from ddt import ddt, dat
@ddt
class TestLogin():
excel = handleexcel() # 读取excel中的数据
cases = excel.read_data()
@data(*cases)
def test_login(self, case):
print(case)

posted @ 2020-11-06 16:50  平淡的梦想  阅读(125)  评论(0)    收藏  举报