DDT,即數據驅動測試,簡單的理解爲數據的改變從而驅動自動化測試的執行,最終引發測試結果的改變。使用外部數據源實現對輸入輸出與指望值的參數化,避免在測試中使用硬編碼的數據。python
1、安裝ddt模塊nginx
pip install ddt
ddt有四種模式:引入裝飾器@ddt;導入數據@data;拆分數據@unpack;導入外部數據@file_datajson
2、參數化實現的方式ruby
一、讀取元組數據框架
#必定要和單元測試框架一塊兒用 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
二、讀取列表數據ide
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'}]) 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個數據※
三、讀取字典數據單元測試
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'}) 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方法裏的形參名稱必定要一致,不然,打印的時候,就會報莫名的參數錯誤。※
四、讀取json文件數據測試
# data_json.json文件 { "test_case1": { "key": "value1", "status_code": 200 }, "test_case2": { "key": "value2", "status_code": 200 }, "test_case3": { "key": "value3", "status_code": 200 } } # python讀取json文件 @ddt class InterfaceTest(unittest.TestCase): def setUp(self): self.url = "http://httpbin.org/get" def tearDown(self): print(self.result) @file_data("data_json.json") #如不在同一級目錄下需另作處理 def test_get_request(self, key, status_code): r = requests.get(self.url, params={"key": key}) self.result = r.json() self.assertEqual(r.status_code, status_code) if __name__ == '__main__': unittest.main()