接口測試之DDT,純代碼實戰,學起來

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()
相關文章
相關標籤/搜索