在作測試的時候,有些地方不管是接口仍是UI只是參數數據的輸入不同,操做過程是同樣的。重複去寫操做過程會增長代碼量,咱們能夠經過參數化的方式解決這個問題,也叫作數據驅動,咱們經過python作參數化的方法有不少種,今天咱們介紹一種簡單的方法DDThtml
官方文檔:https://ddt.readthedocs.io/en/latest/example.htmlpython
ddt屬於python的第3方庫,須要經過pip進行安裝json
pip install ddt
ddt中經常使用的類的裝飾器一個data(能夠直接傳數據)一個find_data(能夠經過json或者yaml傳輸)解壓分析數據unpack,剩下的小夥伴們能夠本身看看源碼進行學習哈api
data裝飾器源碼app
def data(*values): """ 方法裝飾器來添加到您的測試方法中。 應該添加到' ' unittest.TestCase ' '實例的方法中 """ global index_len index_len = len(str(len(values))) return idata(values)
find_data裝飾器源碼post
def file_data(value): """ 方法裝飾器來添加到您的測試方法中。 應該添加到' ' unittest.TestCase ' '實例的方法中。 ' ' value ' '應該是一個相對於文件目錄的路徑 包含修飾過的' ' unittest.TestCase ' '。該文件 應該包含JSON編碼的數據,能夠是列表,也能夠是 字典 對於列表,列表中的每一個值都對應一個值 測試用例,該值將鏈接到測試方法 的名字。 """ def wrapper(func): setattr(func, FILE_ATTR, value) return func return wrapper
unpack源碼學習
def unpack(func): """ 方法裝飾器來添加解壓功能。 """ setattr(func, UNPACK_ATTR, True) return func
這裏咱們經過一個來更加的瞭解下DDT數據驅動的內容測試
經過查詢音樂接口瞭解ddt使用方法編碼
一、首先導入ddt模塊,在類在修飾ddt.ddturl
二、編寫ddt用例格式
三、使用的用例修飾ddt.data
四、查看導入數據是否正確
這裏的參數數據通常字典形式存放,一組數據爲一組字典
# coding:utf-8 import unittest import requests import ddt # 參數數據 testddt = [{'name':'斷橋殘雪'}, {'name':'像魚'}] @ddt.ddt class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b @ddt.data(*testddt) def test01(self,data): print('當前測試數據:%s'%data) result = self.select(data['name']) self.assertEqual(result,data['name']) if __name__ == '__main__': unittest.main()
經過執行後,咱們能夠發現用例所有都是經過的,執行的數據也是咱們ddt中存放的數據
若是數據在字典內容展現,可是下面沒有具體的提取數據,咱們能夠經過這個unpack來解壓數據
# coding:utf-8 import unittest import requests import ddt # 參數數據 testddt = [{'name':'斷橋殘雪'},{'name':'像魚'}] @ddt.ddt class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b @ddt.data(*testddt) @ddt.unpack def test01(self,name): print('當前測試數據:%s'%name) result = self.select(name) self.assertEqual(result,name) if __name__ == '__main__': unittest.main()
file_data能夠經過讀取yaml和json的數據來進行實現,咱們能夠動手試試下,先配置yaml把想要的數據類型都存放在裏面
讀取方法,在用例上方添加裝飾器後面帶上yaml的文件名,經過請求後發現已經請求成功了
# coding:utf-8 import unittest import requests import ddt @ddt.ddt class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b @ddt.file_data('name.yaml') def test01(self,name): print('當前測試數據:%s'%name) result = self.select(name) self.assertEqual(result,name) if __name__ == '__main__': unittest.main() 當前測試數據:斷橋殘雪 當前測試數據:像魚 .. ---------------------------------------------------------------------- Ran 2 tests in 0.244s OK
這裏還有file_data也能夠請求json數據,這裏就不作寫,你們能夠本身動手寫一寫