前提條件:
需要先引入ddt和data,引入方法如下:
1、點擊窗口右上角 project interpreter 點擊左下角的“+”按鈕,(如下圖)
2、在新界面中搜索 ddt data,等待頁面進行搜索,搜索出點擊右下角的 install package 進行安裝
如何使用ddt進行數據驅動:
1、引入ddt 和data
使用form ddt import ddt ,data,為什么不適用import ddt,data,詳見https://www.cnblogs.com/qingrc/p/11648688.html
2、通過例子進行簡單說明(未結合動態參數使用)
1)ddt 用來裝飾類
2)data 用來裝飾測試方法
在使用data進行解包后需要使用item來接收解包后的數據,
使用的數據為 t = ('蘋果','火龍果','香蕉','柚子')
import unittest # import ddt,data # 該引進方法會報錯 TypeError: 'module' object is not callable from ddt import ddt,data t = ('蘋果','火龍果','香蕉','柚子') @ddt # 裝飾類 class TestDdt(unittest.TestCase): @data(t) # 裝飾方法,data解包之后 有幾個參數就運行幾條用例 def test_001(self,item): print('開始打印參數') print('取到的參數是{}'.format(item)) print('結束打印參數')
if __name__ == '__main__':
# p = TestDdt()
# p.test_001()
unittest.main()
注意:在調用的時候直接使用 unittest.main() 去調用,不能使用創建對象的方法去調用,原因為我們使用的是unittest框架 unittest.main()會實例化 TestCase的子類
3、結合動態參數生成多條測試用例
動態參數:*args
關鍵字參數:**kwargs
使用的數據為:t1 = (('蘋果','火龍果'),('香蕉','柚子'))
import unittest # import ddt,data # 該引進方法會報錯 TypeError: 'module' object is not callable from ddt import ddt,data t1 = (('蘋果','火龍果'),('香蕉','柚子')) @ddt # 裝飾類 class TestDdt(unittest.TestCase): @data(*t1) # 裝飾方法,data解包之后 有幾個參數就運行幾條用例 def test_001(self,item): print('開始打印參數') print('取到的參數是{}'.format(item)) print('結束打印參數') if __name__ == '__main__': unittest.main()
可以根據運行結果進行對比 使用和未使用動態參數的區別
--未使用動態參數,可以看到我們運行了一條測試用例
--使用動態參數,將t1進行解包生成兩個數據,執行兩次測試用例
注意:運行結果里面 上方 . 代表運行一條測試用例成功,..代表兩條測試用例運行成功。
4、unpack的使用方法
import unittest from ddt import ddt,data,unpack t1 = (('蘋果','火龍果'),('香蕉','柚子')) @ddt # 裝飾類 class TestDdt(unittest.TestCase): @data(*t1) # 裝飾方法,data解包之后 有幾個參數就運行幾條用例 @unpack # 根據,將上一層的數據再次進行根據逗號進行拆分 因為是兩個參數 所以要用兩個參數進行接收,注意:有幾個變量就用幾個參數進行接收 def test_001(self,a,b): # 在此處給參數添加默認值 print('test_001開始打印參數') print('test_001取到的a是{}'.format(a)) print('test_001取到的b是{}'.format(b)) print('test_001結束打印參數') print() if __name__ == '__main__': unittest.main()
注意:當前后參數不一致時,添加默認值None ,所有參數都可以添加。
import unittest from ddt import ddt,data,unpack # t = ('蘋果','火龍果','香蕉','柚子') t1 = (('蘋果','火龍果'),('香蕉','柚子')) t2 = (('蘋果','火龍果'),('香蕉','柚子','橘子')) # 當前后參數不一致時,添加默認值none 使得程序不報錯 d = {'fruit1': '蘋果', 'fruit2': '火龍果', 'fruit3': '香蕉', 'fruit4': '柚子'} # 只能打印出key d1 = [{'fruit1': '蘋果', 'fruit2': '火龍果'}, {'fruit1': '香蕉', 'fruit2': '柚子'}] # 列表里面套2個字典,打印出來的是value @ddt # 裝飾類 class TestDdt(unittest.TestCase): @data(*t2) # 裝飾方法,data解包之后 有幾個參數就運行幾條用例 @unpack # 根據,將上一層的數據再次進行根據逗號進行拆分 因為是兩個參數 所以要用兩個參數進行接收,注意:有幾個變量就用幾個參數進行接收 def test_001(self,a,b,c=None): print('test_001開始打印參數') print('test_001取到的a是{}'.format(a)) print('test_001取到的b是{}'.format(b)) print('test_001取到的c是{}'.format(c)) print('test_001結束打印參數') print() @data(*d) # 裝飾方法,data解包之后 有幾個參數就運行幾條用例 def test_002(self,item2): print('test_002開始打印參數') print('test_002取到的參數是{}'.format(item2)) print('test_002結束打印參數') print() @data(*d1) # 裝飾方法,data解包之后 有幾個參數就運行幾條用例 @unpack # 如果解包的是字典,參數名應與key保持一致,否則報錯 def test_003(self,fruit1,fruit2): print('test_003開始打印參數') print('test_003取到的參數是{}'.format(fruit1)) print('test_003取到的參數是{}'.format(fruit2)) print('test_003結束打印參數') print() if __name__ == '__main__': unittest.main()