介面測試之DDT,純程式碼實戰,學起來
DDT,即資料驅動測試,簡單的理解為資料的改變從而驅動自動化測試的執行,最終引起測試結果的改變。使用外部資料來源實現對輸入輸出與期望值的引數化,避免在測試中使用硬編碼的資料。
一、安裝ddt模組
pip install ddt
ddt有四種模式:引入裝飾器@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'}])
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'})
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、讀取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()
「其他文章」
- 隨心譯——無廣告的專屬實時翻譯神器
- OSPF雙點雙規與雙歸屬實驗
- VUE匯入功能/下載功能
- 虛擬機器VBox安裝CentOS6.8,內外網訪問
- Kafka及場景應用(中2)
- 以B站C語言影片為基礎的課後總結
- Linux學習:unix的標準化的實現(Linux中各種限制-資料型別-各種標準化標頭檔案介紹)
- 這個開源專案太神了,找工作,炒股和賺錢就靠它了 - 知乎
- Leetcode 劍指Offer 刷題合集
- ubuntu禁止和啟動核心更新的兩種方式
- 前端技術Json Ajax NodeJS
- RabbitMQ web 介面訪問
- 詳解MFS分散式儲存系統
- cpio 命令
- Linux與Windows有什麼區別?常見程式語言有啥區別?
- 2020年就要過去了,我一點也不懷念它
- pta10-1 查詢沒有選修‘C語言‘課程的學生 (10分)
- 【網路工程師路由篇】——華為靜態路由基礎
- ###好好好####RL-GAN For NLP: 強化學習在生成對抗網路文字生成中扮演的角色
- SQL Server 2014 軟體安裝教程