什么场景下基于ddt进行设计,这种设计模式的意义?
实现同一脚本对多组数据进行测试,最终实现数据与脚本的分离,便于维护与扩展;
下载DDT库:pip install ddt
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)
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)
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方法的参数也要写三个,需要匹配上;