unittest10--数据驱动测试-DDT
什么是DDT
Data Driver Test
由外部数据集合来驱动测试用例,一组不同的数据来执行相同的操作(一份脚本),测试数据和测试操作进行完全的分离的脚本设计模式
从数据文件读取输入数据,通过变量的参数化,将测试数据传入测试脚本,不同的数据文件对应不同的测试用例
在这种模式下数据和脚本分离,脚本的利用率、可维护性大大提高,数据的覆盖率也较高
ddt只需要读文件并按格式返回数据以及指定参数名,对参数的处理ddt都已经封装好,不再需要自己写循环
ddt使用方法
安装ddt第三方模块
pip install ddt
导入ddt相关模块
from ddt import ddt, data, unpack
使用@ddt装饰器修饰测试类
表示使用ddt数据驱动方式
放在类的定义之前,紧挨着
使用@data进行数据解包(拆出用例中的多行)
@data(case_data)
放在测试方法之前
将case_data拆分成一个或多个一维列表,相当于获得用例中的多行
使用@unpack继续数据解包(拆出一行用例中的多列)
@unpack
放在@data之后,测试方法之前
将@data解包出的每一个一维列表继续拆分成多个数据,按顺序传递给测试用例的形参,相当于获得一条用例中的多列
data(多个数据)
@data(多个数据)
@ddt
class ClassName(unittest.TestCase):
@data(1, 2, 3)
def test(self, a):
@data根据最外层的逗号拆分数据为3个
循环执行test方法3次,并将数据分3次传给形参
目的:读取一维数据
from ddt import ddt,data,unpack
import unittest
@ddt()
class testdemo01(unittest.TestCase):
@data(1,2,3)
def test01(self,a):
print(a)
if __name__=='__main__':
unittest.main()
data(一个一维列表)
@ddt
class ClassName(unittest.TestCase):
@data(['zhsan',1])
@unpack
def test(self, arg1, arg2):
[ ]不能省略
@data(['zhsan',1])取到一个一维列表['zhsan',1],循环执行test方法1次
@unpack在每次循环中拆出2列数据
接收数据的参数的个数与列表元素个数要一致
读取一个一维列表
import unittest
from ddt import ddt,data,unpack
@ddt
class ClassName(unittest.TestCase):
@data(['zhsan',1])
@unpack
def test(self, arg1, arg2):
print(arg1,arg2)
if __name__=='__main__':
unittest.main()
data(多个一维列表)
@data(多个一维列表)
@data(['zhsan',1], ['lisi',2])
@unpack
@data(['zhsan',1], ['lisi',2])取到2个一维列表,循环2次
@unpack表示将@data拆出的2个一维列表,继续进行拆分出元素
第1次拆出2个数据zhsan和1
第2次拆出2个数据lisi和2
接收数据的参数的个数与列表元素个数要一致
读取多个一维列表
import unittest
from ddt import ddt, data, unpack
@ddt()
class Testdemo02(unittest.TestCase):
@data(['zhsan', 1], ['lisi', 2])
@unpack
def test02(self, uname, upasswd):
print(uname, upasswd)
if __name__ == '__main__':
unittest.main()
data(一个字典)
@data({'uname':'zhsan','passwd':1})
@unpack
def test(self, uname, passwd)
测试方法中的参数名要与字典键同名,顺序可以不一致
读取一个字典
import unittest
from ddt import ddt, data, unpack
@ddt()
class Testdemo02(unittest.TestCase):
@data({'uname': 'zhsan', 'passwd': 1})
@unpack
def test02(self, uname, passwd):
print(uname, passwd)
if __name__ == '__main__':
unittest.main()
data(多个一维字典)
@data(多个一维字典)
@data({'uname':'zhsan','passwd':1},{'uname':'lisi','passwd':2})
@unpack
def test(self, uname, passwd):
测试方法中的参数名要与字典键同名,顺序可以不一致
读取多个一维字典
import unittest
from ddt import ddt, data, unpack
@ddt()
class Testdemo02(unittest.TestCase):
@data({'uname': 'zhsan', 'passwd': 1}, {'uname': 'lisi', 'passwd': 2})
@unpack
def test02(self, uname, passwd):
print(uname, passwd)
if __name__ == '__main__':
unittest.main()
ddt读取二维数据
@data(*一个二维列表)
@data(*[['zhsan',1], ['lisi',2]])
@unpack
@data表示取到2个一维列表
两层 [ ] 不能省略
* 表示去掉一层[ ],* 不能省略
@unpack表示将@data拆出的2个一维列表,继续进行拆分出元素
第1次拆出2个数据zhsan和1
第2次拆出2个数据lisi和2
读取二维数据
import unittest
from ddt import ddt, data, unpack
@ddt()
class Testdemo02(unittest.TestCase):
@data(*[['zhsan', 1], ['lisi', 2]])
@unpack
def test02(self, uname, passwd):
print(uname, passwd)
if __name__ == '__main__':
unittest.main()
使用变量定义二维列表
casedata=[['zhsan',1],['lisi',2]]
@data(*casedata)
@unpack
casedata是二维列表
读取使用变量定义二维列表
import unittest
from ddt import ddt, data, unpack
@ddt()
class Testdemo02(unittest.TestCase):
casedata = [['zhsan', 1], ['lisi', 2]]
@data(*casedata)
@unpack
def test02(self, uname, passwd):
print(uname, passwd)
if __name__ == '__main__':
unittest.main()
data(字典列表)
@data(*[{'uname':'zhsan','passwd':1},{'uname':'lisi','passwd':2}])
@unpack
不能使用嵌套字典
*不能省略
使用变量定义字典列表
casedata=[{'uname':'zhsan','passwd':1},{'uname':'lisi','passwd':2}]
@data(*casedata)
* 不能省略
读取使用变量定义字典列表
import unittest
from ddt import ddt, data, unpack
@ddt()
class Testdemo02(unittest.TestCase):
casedata = [{'uname': 'zhsan', 'passwd': "1"}, {'uname': 'lisi', 'passwd': "2"}]
@data(*casedata)
@unpack
def test02(self, uname, passwd):
print(uname, passwd)
if __name__ == '__main__':
unittest.main()
使用ddt数据驱动读取login.xlsx
在project_M1目录下创建.py文件完成下列代码:
from ddt import ddt, data, unpack
import unittest, pandas
date = pandas.read_excel('./excelcases/login.xlsx') # DataFram字典
cases = date.values.tolist() # 二维列表
@ddt # 紧邻类,放类前面
class Test(unittest.TestCase):
@data(*cases) # 循环两次,@data以最外层逗号拆分
@unpack # 对@data每次拆除的数据根据逗号拆成多个数据
def test1(self, a, b, c):
print(a, b, c)
if __name__ == '__main__':
unittest.main()
ddt使用注意事项
ddt:数据驱动测试,用于执行大量用例
之前执行大量用例是写for循环,其实ddt就是封装了循环
ddt是与unittest结合使用的,是跟测试类相结合的
ddt数据驱动模块使用步骤
from ddt import ddt,data,unpack
import unittest
@ddt # 紧邻类,放类前面
class Test(unittest.TestCase):
@data([1,2,3],[4,5,6])#data相当于循环两次,根据最外侧逗号拆分一次
# data中各组数据要对应,如果不对应要用none代替
@unpack # 对@data每次拆除的数据根据逗号拆成多个数据
def test1(self,a,b,c):
print(a,b,c)
if __name__=='__main__':
unittest.main()
本文来自博客园,作者:暄总-tester,转载请注明原文链接:https://www.cnblogs.com/sean-test/p/15522382.html

浙公网安备 33010602011771号