python數據處理之 ddt,@data, @unpack


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對應

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM