Python+unittest+DDT實現資料驅動測試
前言
資料驅動測試:
- 避免編寫重複程式碼
- 資料與測試指令碼分離
- 通過使用資料驅動測試,來驗證多組資料測試場景
- 通常來說,多用於單元測試和介面測試
ddt介紹
Data-Driven Tests(DDT)即資料驅動測試,可以實現不同資料運行同一個測試用例。ddt本質其實就是裝飾器,一組資料一個場景。
ddt模組包含了一個類的裝飾器ddt和三個個方法的裝飾器:
data:包含多個你想要傳給測試用例的引數,可以為列表、元組、字典等;
file_data:會從json或yaml中載入資料;
unpack:分割元素,如以下示例:
@data([a,d],[c,d])
如果沒有@unpack,那麼[a,b]當成一個引數傳入用例執行
如果有@unpack,那麼[a,b]被分解開,按照用例中的兩個引數傳遞
安裝
pip install ddt
使用data裝飾器
傳遞整體列表,字典、元組
import unittest from ddt import ddt,data,unpack def add(a,b): return a+b @ddt class MyTest(unittest.TestCase): # @data([1,2,3,4,5,6,7]) @data({"a":"1","b":2}) # @data((1,3)) def test(self,data): print(data) if __name__ == '__main__': unittest.main(verbosity=2)
巢狀列表、元組、字典的整體傳遞方式
import unittest from ddt import ddt,b): return a+b @ddt class MyTest(unittest.TestCase): # @data(*[[1,3],[1,1],[0,0],1,3]]) # @data(*[{"a":1},{"a":2},{"a":3},{"a":4}]) @data(*[(1,5),(4,2),(6,7),(5,6)]) def test(self,data): print(data) if __name__ == '__main__': unittest.main(verbosity=2)
使用unpack裝飾器
unpack 依次傳遞元組
import unittest from ddt import ddt,b): return a+b @ddt class MyTest(unittest.TestCase): @data((1,3),(1,1),(0,0),3)) @unpack def test(self,a,b,c): print(a,c) if a+b == c: print(True) else: print(False) if __name__ == '__main__': unittest.main(verbosity=2)
輸出結果:
1 2 3
True
1 0 1
True
0 0 0
True
1 1 3
False
依次傳遞字典
import unittest from ddt import ddt,unpack def add(a,b): return a+b @ddt class MyTest(unittest.TestCase): @data({"a":1,"b":1,"c":2},{"a":0,"b":0,"c":0},{"a":-1,"c":0}) @unpack def test(self,c) if a + b == c: print(True) else: print(False) if __name__ == '__main__': unittest.main(verbosity=2)
輸出結果:
1 1 2
True
0 0 0
True
-1 1 0
True
依次傳遞列表
import unittest from ddt import ddt,b): return a+b @ddt class MyTest(unittest.TestCase): @data([1,3]) @unpack def test(self,c) if a + b == c: print(True) else: print(False) if __name__ == '__main__': unittest.main(verbosity=2)
輸出結果:
1 2 3
True
1 0 1
True
0 0 0
True
1 1 3
False
使用file_data裝飾器
ddt支援從檔案中載入資料,@file_data()裝飾器會從json或yaml中載入資料。只有以“.yml” 和 “.yaml” 結尾的檔案被載入為Yaml檔案。所有其他格式檔案都作為json檔案載入,比如txt。
傳遞json資料
test.json檔案
{ "case1": { "a": 1,"b": 1,"c": 2 },"case2": { "a": -1,"c": 0 },"case3": { "a": 0,"b": 0,"c": 0 } }
import unittest from ddt import ddt,file_data def add(a,b): return a+b @ddt class MyTest(unittest.TestCase): @file_data("test.json") def test(self,c) if __name__ == '__main__': unittest.main(verbosity=2)
傳遞多層json檔案
test.json檔案
{ "case1": { "data": { "a": 1,"b": 1 },"result": 2 },"case2": { "data": { "a": 0,"result": 1 },"case3": { "data": { "a": 0,"b": 0 },"result": 0 } }
import unittest from ddt import ddt,result): print(data,result) if __name__ == '__main__': unittest.main(verbosity=2)
傳遞yml資料
yml 需要安裝yml(pip install PyYAML)
test.yml
def add(a,b): return a+b @ddt class MyTest(unittest.TestCase): @file_data("test.yml") def test(self,c)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。