python數據驅動--ddt的使用

一、使用ddt可以方便我們對測試case的管理

一般進行接口測試時,每個接口的傳參都不止一種情況,一般會考慮正向、逆向等多種組合。所以在測試一個接口時通常會編寫多條case,而這些case除了傳參不同外,其實並沒什麼區別。
這個時候就可以利用ddt來管理測試數據,提高代碼複用率。

二、ddt的安裝方法以及四種模式
1、pip install ddt
2、四種模式:
① 裝飾器@ddt
② 導入數據的@data
③ 拆分數據的@unpack
④ 導入外部數據的@file_data

三、案例的演示

1、讀取元組數據

#一定要和單元測試框架一起用
import unittest,os
from ddt import ddt,data,unpack,file_data

'''NO.1單組元素'''
@ddt
class Testwork(unittest.TestCase):
    
    @data(1,2,3)
    def test_01(self,value):      #value用來接收data的數據
        print(value)
if __name__ == '__main__':
    unittest.main()
結果:
=>1
  2
  3

'''NO.2多組未分解元素'''
@ddt
class Testwork(unittest.TestCase):

    @data((1,2,3),(4,5,6))
    def test_01(self,value):       
        print(value)

if __name__ == '__main__':
    unittest.main()
結果:
=>(1, 2, 3)
  (4, 5, 6)

'''NO.3多組分解元素'''
@ddt
class Testwork(unittest.TestCase):

    @data((1,2,3),(4,5,6))
    @unpack          #拆分數據
    def test_01(self,value1,value2,value3):    #每組數據有3個值,所以設置3個形參
        print(value)

if __name__ == '__main__':
    unittest.main()
結果:
=>1 2 3
  4 5 6

2、讀取列表數據

import unittest,os
from ddt import ddt,data,unpack,file_data

'''NO.1單組元素和多組元素未分解都一樣,下面看嵌套,考眼力了~'''
@ddt
class Testwork(unittest.TestCase):

    @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])
    # @unpack
    def test_01(self,a):
        print(a)

if __name__ == '__main__':
    unittest.main()
結果:
=>[{'name': 'lili', 'age': 12}, {'sex': 'male', 'job': 'teacher'}]
※上面結果可以看出:無法運用到requests數據請求中,所以不是很實用※

'''NO.2多組元素分解'''
@ddt
class Testwork(unittest.TestCase):

    @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])
    @unpack
    def test_01(self,a,b):
        print(a,b)

if __name__ == '__main__':
    unittest.main()
結果:
=>{'name': 'lili', 'age': 12} {'sex': 'male', 'job': 'teacher'}
※拆分後的運行結果,不帶有[ ],拆分是將列表中的2個字典拆分,所以有2個數據※

3、讀取字典數據

import unittest,os
from ddt import ddt,data,unpack,file_data

'''※字典的讀取比較特殊,因爲在拆分的時候,形參和實參的key值要一致,否則就報錯※'''

'''NO.1單組數據'''
@ddt
class Testwork(unittest.TestCase):

    @data({'name':'lili','age':'16'},{'sex':'female','job':'nurser'})
    # @unpack
    def test_01(self,a):
        print(a)

if __name__ == '__main__':
    unittest.main()
結果:
=>{'name': 'lili', 'age': '16'}
  {'sex': 'female', 'job': 'nurser'}
※以上運行的結果數據,就可以用來作爲requests的請求參數~!※

'''NO.2多數據拆分,重點來了'''
@ddt
class Testwork(unittest.TestCase):

    @data({'name':'lili','age':'16'},{'name':'female','age':'nurser'})
    @unpack
    def test_01(self,name,age):
        print(name,age)

if __name__ == '__main__':
    unittest.main()
結果:
=>lili 16
  female nurser
※重點來了:首先結果展示的數據是字典裏的value,沒有打印key的值;其次@data裏的數據key值和def方法裏的形參
名稱一定要一致,否則,打印的時候,就會報莫名的參數錯誤,這裏就不做展示,愛學習的同學可以嘗試一下~!※

4、讀取文件數據

import unittest,os
from ddt import ddt,data,unpack,file_data

'''數據格式必須爲json,且必須爲雙引號的鍵值對形式,如果不是json格式,有列表等其它格式嵌套的話,無論是
否有@unpack,形參和參數數量都要和key值相等'''
@ddt
class testwork(unittest.TestCase):
    testdata=[{'a':'lili','b':12},{'a':'sasa','b':66}]
    @data(*testdata)
    # @unpack
    def test_01(self,value):
        print(value)

    @file_data(os.getcwd()+'/jsonll.txt')
    def test_02(self,value2):
        print(value2)

if __name__ == '__main__':
    unittest.main()
結果:
=>{'a': 'lili', 'b': 12}
  {'a': 'sasa', 'b': 66}
  nick
  male
  29

備註:文章轉自 https://www.jianshu.com/p/78998bcf3e05


以下自己總結:方便自己理解
1、@unpack這個裝飾器,默認會對@date裝飾器內容中的每一項以"逗號"進行數據的分解。
舉例:

import unittest
from ddt import ddt, data, unpack


@ddt
class TestMethod(unittest.TestCase):

    case = [{"data1": 1, "data2": 2},{"data1": 3, "data2": 4}]
    # *case是對 case進行解包, 就相當於把case的外層中括號去掉,由一個列表變成兩個字典
    @data(*case)
    @unpack # 拆包是對每個字典進行數據拆分,通過字典的‘逗號’,分成data1, data2 兩個數據
    def test01(self, data1, data2): # data1 和data2 也可以統一用**kwargs 來表示 直接用			
        print(data1, data2)			# print(kwarts.get('data1')) 也可以得到 data1的值
        
	 結果爲 ..
		1 2
		3 4
	# 如果case中不是字典而是元組或者列表原理是一樣的
	
	case1 = [(5, 6), (7, 8)]

    @data(*case1)
    @unpack # 對每個元組進行中的兩個數據進行拆解‘逗號’分解
    def test02(self, a, b): # 設置兩個變量進行接收 如果是字典的話形參必須和字典中的key保持一致
        print(a, b)
        
	結果爲:
		5 6
		7 8

if __name__ == '__main__':
    unittest.main()

2、@file_data(), 這個裝飾器的括號內可以加入一個用例case的文件路徑可以是yaml格式或者excel格式
這裏以yaml格式來舉例

yaml文件case.yaml

-
  test1:
    test2: 1
    test3: 2
    test4: 3
    test5:
      - a
      - b
      - c
-
  test6:
    - d
    - f
    - g

python代碼:

import unittest
from ddt import ddt, data, unpack,file_data


@ddt
class TestMethod(unittest.TestCase):

    # case1 = [(1, 2), (3, 4)]
    @file_data('./test.yaml')

    # @data(*case1)
    @unpack
    def test02(self, **kwargs):
        print(kwargs)
	結果爲:
	{'test1': {'test2': 1, 'test3': 2, 'test4': 3, 'test5': ['a', 'b', 'c']}}
	{'test6': ['d', 'f', 'g']}

if __name__ == '__main__':
    unittest.main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章