一、DDT介绍
- Data Driver Test 数据驱动测试;
- 作用:由外部数据集合来驱动测试用例执行;
- 数据驱动:它是一种主要设计模式一,数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。说的直白些,就是参数化的应用;
- 核心思想:数据和测试代码的分离
- 优点:当测试数据发生大量变化的情况下,测试代码可以保持不变;
什么场景下基于ddt进行设计,这种设计模式的意义?
-
实现同一脚本对多组数据进行测试,最终实现数据与脚本的分离,便于维护与扩展;
-
下载DDT库:
pip install ddt
二、DDT基础使用
1.传递基础数据类型
import unittest
# 导入ddt库下所有内容
from ddt import *
# 在测试类前必须首先声明使用 ddt
@ddt
class TestCan(unittest.TestCase):
@data(1, 2, 3, 4)
def test_int(self, i):
print("test_int", i)
@data("a", "b", "c", "d")
def test_str(self, str):
print("test_str", str)
执行结果:
2.传递一个复杂的数据结构
import unittest
from ddt import *
@ddt()
class TestDemo(unittest.TestCase):
tuples = ((1, 2, 3), (4, 5, 6))
lists = [[10, 20, 30], [40, 50, 60]]
# 元组
@data((1, 2, 3), (4, 5, 6))
def test_01_tuple(self, n):
print("test_tuple", n)
# 元组2
@data(*tuples)
def test_02_tuples(self, n):
print("test_tuples", n)
# 列表
@data([10, 20, 30], [40, 50, 60])
def test_03_list(self, n):
print("test_list", n)
# 列表2
@data([10, 20, 30], [40, 50, 60])
@unpack
def test_04_list(self, n1, n2, n3):
print("test_04_lists", n1, n2, n3)
# 列表3
@data(*lists)
@unpack
def test_05_list(self, n1, n2, n3):
print("test_05_lists", n1, n2, n3)
# 字典
@data({"value1": 1, "value2": 2}, {"value1": 3, "value2": 4})
@unpack
def test_06_dict(self, value1, value2):
print("test_dict", value1, value2)
if __name__ == '__main__':
unittest.main(verbosity=2)
执行结果:
3.多参数的数据驱动
import unittest
from ddt import *
@ddt
class TestCase(unittest.TestCase):
@data(["admin", "123456"], ["root", "123456"])
@unpack
def test_01(self, username, password):
print("测试用户登录流程", username, password)
if __name__ == '__main__':
unittest.main(verbosity=2)
执行结果
@unpack
:当传递的是复杂的数据结构时使用。比如使用元组或者列表,添加@unpack
之后, ddt 会自动把元组或者列表对应到多个参数上。字典也可以这样处理;- 当没有加
unpack
时,test_case方法的参数只能填一个;如元组的例子 - 当你加了
unpack
时,传递的数据量需要一致;如列表例子中,每个列表我都固定传了三个数据,当你多传或少传时会报错,而test_case方法的参数也要写三个,需要匹配上;