Python中使用ddt數據驅動應注意的問題


前提條件:

需要先引入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()

 


免責聲明!

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



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