一、使用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()