ddt: 数据驱动思想:data driven testing
data driven testing 数据驱动思想。
现在所说的是一个叫做 ddt 的 python 库
ddt 库是和 unittest 搭配起来使用的, 是 unittest 的一个插件。
python / unittest / ddt 自动化测试框架
格式如下:
@ddt.ddt 没有括号
class TestDemo:
@ddt.data() 右括号
def test_demo(self):
pass
什么的项目适合ddt
举个例子来说明:例如需要设计登录的测试用例,对于登录来说,登录的前置条件不变,变化的是用户名 和密码(也就是仅仅测试数据的变化) 测试数据(test_data)可以用excel来写,也可以用csv来写
一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合,所以在测试一个接口时,通常会编写多条 case,而这些除了传参不同外,并没有什么区别。这个时候就可以利用 ddt 来管理测试数据,提高代码复用率。
@ddt.ddt
class TestLogin(unittest.TestCase):
def setUp(self):
print("######前置条件#######")
def tearDown(self):
print("测试用例执行完毕。#####后置条件####")
@ddt.data(*test_data)
def test_login(self, data_info):
pass
实例代码如下:
import unittest
import ddt
from class_19_excel.common.excel_handler import ExcelHandler
from class_19_excel.common.requests_handler import RequestsHandler
#测试数据
test_data = [
{"url": "http://120.78.128.25:8766/futureloan/member/login",
"method": "post",
"headers": {"X-Lemonban-Media-Type": "lemonban.v2"},
"data": {"mobile_phone": "18111111111", "pwd": "12345678"},
"expected": {"msg":"", "code":""}},
{"url": "http://120.78.128.25:8766/futureloan/member/login",
"method": "post",
"headers": {"X-Lemonban-Media-Type": "lemonban.v2"},
"data": {"mobile_phone": "1811", "pwd": "123"},
"expected": "hello world"},
]
#测试数据放在excel中,调用excel_handler.py(处理excel的封装的模块)
# test_data = ExcelHandler(r"d:\cases.xlsx").read('Sheet1')
# print(test_data)
@ddt.ddt
class TestLogin(unittest.TestCase):
# def setUp(self) -> None:
# 前置条件当中
# 每一个测试用例方法执行之前都会运行的代码
def setUp(self):
pass
def tearDown(self):
print("测试用例执行完毕。")
@ddt.data(*test_data)
# 将 *test_data 当中的一组测试数据 赋值到 data_info 这个参数
def test_login(self, data_info):
res = RequestsHandler().visit(data_info['url'],
data_info['method'],
json=data_info['data'],
headers=data_info['headers'],)
self.assertEqual(res, data_info['expected'])
if __name__ == '__main__':
unittest.main()
代码如下:
import ddt
import unittest
@ddt.ddt
class DataTest(unittest.TestCase):
def setUp(self):
print("这个是前置")
def tearDown(self):
print("这个是后置")
#1,2, 3,4 , 5,6
@ddt.data(
[1,2],
[3,4],
[5,6]
)
@ddt.unpack
def test_add(self,a,b):
print(a+b)
if __name__ == '__main__':
unittest.main()