python 的unittest 沒有自帶數據驅動功能。
所以如果使用unittest,同時又想使用數據驅動,那么就可以使用DDT來完成。
DDT是 “Data-Driven Tests”的縮寫,包含類的裝飾器ddt和兩個方法裝飾器data(直接輸入測試數據),file_data(可以從json或者yaml中獲取測試數據)
【通常情況下,data中的數據按照一個參數傳遞給測試用例,如果data中含有多個數據,以元組,列表,字典等數據,需要自行在腳本中對數據進行分解或者使用unpack分解數據】
說明:
@ddt 讀取單個測試數據:-----裝飾測試類,繼承自TestCase的類
@data()---裝飾測試方法,拿到幾個數據數據就執行幾條用例(可以以“*變量”傳入括號;也可以直接括號放入數值,逗號隔開)
@data(a,b) ------那么a和b各運行一次用例
@data([a,d],[c,d]) -----如果沒有unpack,那么[a,b]當成一個參數傳入用例運行;如果有unpack,那么[a,b]被分解開,按照用例中的兩個參數傳遞
@file_data(filename) ----對於json的文件,每一個json元素按照一個用例運行,可以依照python分解元組,列表或者字典的方式分解傳入
@unpack ----解包,使用復雜的數據結構時,與此同時,測試方法的參數需要多個(參數的傳值個數與解包后數量必須一一對應,“可以考慮用None”)
如果test_data的值很多(大於5)不建議使用unpack,可以考慮直接列表傳出,索引取值(要注意參數不對等的情況)
【注意】使用請先導包
1.傳列表
import unittest from ddt import ddt,data,unpack
import unittest from ddt import ddt,data,unpack test_data=[1,3] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) #脫外套只能一層 def test_print_data(self,item): print(item)
import unittest from ddt import ddt,data,unpack test_data=[[1,3],[4,5]] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) @unpack #在“脫外套”之后,針對你拿到的每一條數據根據逗號進行拆分 def test_print_data(self,a,b): #需要按拆出來的每條數據內的個數進行傳參 print(a) print(b)
2.列表嵌套字典
如果需要對字典進行unpack 參數名需要與你的字典key對應
import unittest from ddt import ddt,data,unpack test_data=[{'no':1,'name':'小李'},{'no':2,'name':'小張'}] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) def test_print_data(self,a): #需要按拆出來的每條數據內的個數進行傳參 print(a['no']) print(a['name'])
import unittest from ddt import ddt,data,unpack test_data=[{'no':1,'name':'小李'},{'no':2,'name':'小張'}] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) @unpack #在“脫外套”之后,針對你拿到的每一條數據根據逗號進行拆分 def test_print_data(self,no,name): #需要按拆出來的每條數據內的個數進行傳參 print(no) print(name)
如果需要對字典進行unpack 參數名需要與你的字典key對應
import unittest from ddt import ddt,data,unpack test_data=[{'no':1,'name':'小李'},{'no':2,'name':'小張'}] @ddt class TestMath(unittest.TestCase): def setUp(self): pass @data(*test_data) @unpack #在“脫外套”之后,針對你拿到的每一條數據根據逗號進行拆分 def test_print_data(self,a,b): #需要按拆出來的每條數據內的個數進行傳參 print(a) print(b) #結果會報錯,參數名需要與你的字典key對應