Python Unittest ddt數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)
1、數(shù)據(jù)驅(qū)動(dòng)介紹:
- @ddt.ddt(類裝飾器,申明當(dāng)前類使用ddt框架)
- @ddt.data(函數(shù)裝飾器,用于給測(cè)試用例傳遞數(shù)據(jù)),支持傳python所有數(shù)據(jù)類型:數(shù)字(int,long,float,compix),字符串,列表1ist,元組tuple,集合,編寫閱讀數(shù)據(jù)文件的函數(shù)、@data入口參數(shù)加*讀取
- @ddt.unpack(函致裝飾器,將傳輸?shù)臄?shù)據(jù)包解包),一般作用于元組tuple和列表list、字典(參數(shù)名字和個(gè)數(shù)需要與字典的鍵保持一致)(數(shù)組、字符串不需要)
- @ddt.file_data(函數(shù)裝飾器,可直接讀取yaml/json文件)
2、數(shù)據(jù)驅(qū)動(dòng)和關(guān)鍵驅(qū)動(dòng)的區(qū)別:
Data-Driven Tests(DDT)即數(shù)據(jù)驅(qū)動(dòng)測(cè)試,可以實(shí)現(xiàn)不同數(shù)據(jù)運(yùn)行同一個(gè)測(cè)試用例。ddt本質(zhì)其實(shí)就是裝飾器,一組數(shù)據(jù)一個(gè)場(chǎng)景。
關(guān)鍵字驅(qū)動(dòng)(核心:把業(yè)務(wù)邏相封裝成關(guān)鍵字login,只需要調(diào)用login。)
3、混合驅(qū)動(dòng)模式(關(guān)鍵字驅(qū)動(dòng)+數(shù)據(jù)驅(qū)動(dòng))
4、在進(jìn)行數(shù)據(jù)驅(qū)動(dòng)測(cè)試實(shí)戰(zhàn):需要在測(cè)試類上使用@ddt.ddt裝飾器,在測(cè)試用例上使用@ddt.data裝飾器。
(1)單一參數(shù):導(dǎo)包——寫一個(gè)參數(shù)(列表、數(shù)字、字符串)-----設(shè)置@ddt.data裝飾器寫入?yún)?shù)名----方法中寫入形參*data----調(diào)用參數(shù)內(nèi)容
(2)多參數(shù)的數(shù)據(jù)驅(qū)動(dòng)測(cè)試(一個(gè)測(cè)試參數(shù)中含多個(gè)元素):導(dǎo)包——設(shè)置@ddt裝飾器——設(shè)置@unpack解包——寫入?yún)?shù)——形參傳遞——調(diào)用
(3)txt文件傳參
(4)json文件傳參
(5)yaml文件傳參
(6)xlsx文件傳參
注意:Python中傳遞可變參數(shù):*代表順序閱讀列表類型,**代表順序閱讀對(duì)象(字典)類型,點(diǎn)擊閱讀可變參數(shù)部分可了解相關(guān)機(jī)制
# 1、單一參數(shù)的數(shù)據(jù)驅(qū)動(dòng)
# 前置步驟:
# 使用語句import unittest導(dǎo)入測(cè)試框架
# 使用語句from ddt import ddt, data導(dǎo)入單一參數(shù)的數(shù)據(jù)驅(qū)動(dòng)需要的包
# 示例會(huì)執(zhí)行三次test,參數(shù)分別為'666','777','888'
import ddt
import unittest
@ddt.ddt # 設(shè)置@ddt裝飾器
class BasicTestCase(unittest.TestCase):
@ddt.data('666', '777', '888') # 設(shè)置@data裝飾器,并將傳入?yún)?shù)寫進(jìn)括號(hào)
def test(self, *data): # test入口設(shè)置形參
print('數(shù)據(jù)驅(qū)動(dòng)的number:', data)
# 程序會(huì)執(zhí)行三次測(cè)試,入口參數(shù)分別為666、777、888
# 2、多參數(shù)的數(shù)據(jù)驅(qū)動(dòng)
# 在單一參數(shù)包的基礎(chǔ)上,額外導(dǎo)入一個(gè)unpack的包,from ddt import ddt, data, unpack
# 步驟:導(dǎo)包——設(shè)置@ddt裝飾器——設(shè)置@unpack解包——寫入?yún)?shù)——形參傳遞——調(diào)用
import ddt
import unittest
Testdata = [
{"username": "admin", "password": "123456", "excepted": {'code': '200', 'msg': '登錄成功'}},
{"username": None, "password": "1234567", "excepted": {'code': '400', 'msg': '用戶名或密碼不能為空'}},
{"username": "admin", "password": None, "excepted": {'code': '400', 'msg': '用戶名或密碼不能為空'}},
{"username": "admin", "password": "123456789", "excepted": {'code': '404', 'msg': '用戶名或密碼錯(cuò)誤'}},
]
@ddt.ddt
class BasicTestCase(unittest.TestCase):
#方式一:直接將列表放到data
@ddt.data(['張三', '18'], ['李四', '19']) # 設(shè)置@data裝飾器,并將同一組參數(shù)寫進(jìn)中括號(hào)[]
@ddt.unpack # 設(shè)置@unpack裝飾器順序解包,缺少解包則相當(dāng)于name = ['張三', '18']
def test(self, name, age):
print('姓名:', name, '年齡:', age)
# 程序會(huì)執(zhí)行兩次測(cè)試,入口參數(shù)分別為['張三', '18'],['李四', '19']
#方式二:寫一個(gè)列表后,使用*訪問列表到data
@ddt.data(*Testdata)
@ddt.unpack # 設(shè)置@unpack裝飾器順序解包
def test_DataDriver(self, *Data):
#print('DDT數(shù)據(jù)驅(qū)動(dòng)實(shí)戰(zhàn)演示:', Data)
res = login.login_check(Testdata['username'], Testdata['password'])
self.assertEqual(res, Testdata['excepted'])
#3、 txt文件接收參數(shù)
# 新建num文件,txt格式
# (1)單一參數(shù)按行存儲(chǔ)777,888,999
# (2)多參數(shù)txt文件
# dict文件內(nèi)容(參數(shù)列表)(按行存儲(chǔ)):
# 張三,18
# 李四,19
# 編輯閱讀數(shù)據(jù)文件的函數(shù)
# 記住讀取文件一定要設(shè)置編碼方式,否則讀取的漢字可能出現(xiàn)亂碼!?。。。?!
import ddt
import unittest
def read_num():
lis = [] # 以列表形式存儲(chǔ)數(shù)據(jù),以便傳入@data區(qū)域
with open('num.txt', 'r', encoding='utf-8') as file: # 以只讀'r',編碼方式為'utf-8'的方式,打開文件'num',并命名為file
for line in file.readlines(): # 循環(huán)按行讀取文件的每一行
lis.append(line.strip('\n')) #單一參數(shù),每讀完一行將此行數(shù)據(jù)加入列表元素,記得元素要?jiǎng)h除'/n'換行符?。?!
#lis.append(line.strip('\n').split(',')) # 多參驅(qū)動(dòng),刪除換行符,根據(jù),分割后,列表為['張三,18', '李四,19', '王五,20']
return lis # 將列表返回,作為@data接收的內(nèi)容
@ddt.ddt
class BasicTestCase(unittest.TestCase):
@ddt.data(*read_num()) # 入口參數(shù)設(shè)定為read_num(),因?yàn)榉祷刂凳橇斜恚约?表示逐個(gè)讀取列表元素
#txt表格有多少個(gè)值,設(shè)置多少個(gè)接收參數(shù)的形參
def test(self, name,age):
print('數(shù)據(jù)驅(qū)動(dòng)的number:', name,age)
# 4、JSON文件傳參:數(shù)據(jù)分離
# 多參數(shù)——json文件
# 步驟和單一參數(shù)類似,僅需加入@unpack裝飾器以及多參數(shù)傳參入口
# dict文件內(nèi)容(參數(shù)列表)(非規(guī)范json文件格式):
# 單一參數(shù):["666","777","888"]
# 多個(gè)參數(shù):[["張三", "18"], ["李四", "19"], ["王五", "20"]]
# 注意json文件格式字符串用雙引號(hào)
import ddt
import unittest
import json
def read_dict_json():
return json.load(open('dict.json', 'r', encoding='utf-8')) # 使用json包讀取json文件,并作為返回值返回
@ddt.ddt
class BasicTestCase(unittest.TestCase):
@ddt.data(*read_dict_json())
@ddt.unpack # 使用@unpack裝飾器解包
def test(self, name, age): # 因?yàn)槭欠且?guī)范json格式,所以形參名無限制,下文會(huì)解釋規(guī)范json格式
print('姓名:', name, '年齡:', age)
# 4、JSON文件傳參:數(shù)據(jù)分離
# json文件三種形式:
# (1)單一參數(shù):["666","777","888"]
# (2)多個(gè)參數(shù):[["張三", "18"], ["李四", "19"], ["王五", "20"]]
# (3)JSON格式讀取,每一組參數(shù)以對(duì)象形式存儲(chǔ):
# [
# {"name":"張三", "age":"18"},
# {"name":"李四", "age":"19"},
# {"name":"王五", "age":"20"}
# ]
# 單一參數(shù)時(shí)無需使用unpack,多參數(shù)需要使用unpack解包,注意json文件格式字符串用雙引號(hào)
import ddt
import unittest
import json
#方式1:非正式j(luò)son格式使用
def read_dict_json():
return json.load(open('dict.json', 'r', encoding='utf-8')) # 使用json包讀取json文件,并作為返回值返回
#方式2:JSON格式讀取,提取已讀完后的json文件(字典形式),通過遍歷獲取元素,并返回
def read_dict_json():
lis = []
dic = json.load(open('dict.json', 'r', encoding='utf-8'))
# 此處加上遍歷獲取語句,下文yaml格式有實(shí)例,方法一樣
for item in dic:
lis.append(item)
return lis
@ddt.ddt
class BasicTestCase(unittest.TestCase):
@ddt.data(*read_dict_json())
@ddt.unpack # 使用@unpack裝飾器解包
def test(self, name, age): # 因?yàn)槭欠且?guī)范json格式,所以形參名無限制,下文會(huì)解釋規(guī)范json格式
print('姓名:', name, '年齡:', age)
#5、多參數(shù)yaml
# 以對(duì)象形式存儲(chǔ)yml數(shù)據(jù)(字典)
# yaml格式文件內(nèi)容
# -
# name: 張三
# age: 18
# -
# name: 李四
# age: 19
# -
# name: 王五
# age: 20
# '-'號(hào)之后一定要打空格?。?!
# ':'號(hào)之后一定要打空格!??!
# 入口參數(shù)與數(shù)據(jù)參數(shù)key命名統(tǒng)一即可導(dǎo)入
import ddt
import unittest
import yaml
@ddt.ddt
class BasicTestCase(unittest.TestCase):
#方式1:形參入口和數(shù)據(jù)參數(shù)key命名統(tǒng)一
@ddt.file_data('./data/dict.yml')
def test(self, name, age): # 設(shè)置入口參數(shù)名字與數(shù)據(jù)參數(shù)命名相同即可
print('姓名是:', name, '年齡為:', age)
#方式2:入口參數(shù)與數(shù)據(jù)參數(shù)命名不統(tǒng)一
@ddt.file_data('./data/dict.yml')
def test(self, **cdata): # Python中可變參數(shù)傳遞的知識(shí):**按對(duì)象順序執(zhí)行
print('姓名是:', cdata['name'], '年齡為:', cdata['age']) # 通過對(duì)象訪問語法即可調(diào)用
例子如下:
方式一:測(cè)試數(shù)據(jù)直接寫成列表形式,使用ddt.data(*Data)傳值
##2.12.2 DDT在自動(dòng)化測(cè)試中的應(yīng)用(傳列表)
import ddt
import unittest
# 給4條測(cè)試數(shù)據(jù)
Testdata = [
{"username": "admin", "password": "123456", "excepted": {'code': '200', 'msg': '登錄成功'}},
{"username": None, "password": "1234567", "excepted": {'code': '400', 'msg': '用戶名或密碼不能為空'}},
{"username": "admin", "password": None, "excepted": {'code': '400', 'msg': '用戶名或密碼不能為空'}},
{"username": "admin", "password": "123456789", "excepted": {'code': '404', 'msg': '用戶名或密碼錯(cuò)誤'}},
]
@ddt.ddt
class TestModules(unittest.TestCase):
def setUp(self):
print('testcase beaning....')
def tearDown(self):
print('testcase ending.....')
@ddt.data(*Data)
def test_DataDriver(self,Data):
#print('DDT數(shù)據(jù)驅(qū)動(dòng)實(shí)戰(zhàn)演示:',Testdata)
res = login.login_check(Testdata['username'], Testdata['password'])
self.assertEqual(res, Testdata['excepted'])
if __name__ == '__main__':
unittest.main()
方式二:數(shù)據(jù)寫到方法形式readData(),使用ddt.data(*readData())傳值
import ddt
import unittest
# 給4條測(cè)試數(shù)據(jù)
def readData():
Testdata = [
{"username": "admin", "password": "123456", "excepted": {'code': '200', 'msg': '登錄成功'}},
{"username": None, "password": "1234567", "excepted": {'code': '400', 'msg': '用戶名或密碼不能為空'}},
{"username": "admin", "password": None, "excepted": {'code': '400', 'msg': '用戶名或密碼不能為空'}},
{"username": "admin", "password": "123456789", "excepted": {'code': '404', 'msg': '用戶名或密碼錯(cuò)誤'}},
]
return TestData
@ddt.ddt
class TestModules(unittest.TestCase):
def setUp(self):
print('testcase beaning....')
def tearDown(self):
print('testcase ending.....')
@ddt.data(*readData())
def test_DataDriver(self,Data):
#print('DDT數(shù)據(jù)驅(qū)動(dòng)實(shí)戰(zhàn)演示:',Testdata)
res = login.login_check(Testdata['username'], Testdata['password'])
self.assertEqual(res, Testdata['excepted'])
if __name__ == '__main__':
unittest.main()
到此這篇關(guān)于Python Unittest ddt數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python Unittest ddt數(shù)據(jù)驅(qū)動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python 基于DDT實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試
- 基于Python的接口自動(dòng)化unittest測(cè)試框架和ddt數(shù)據(jù)驅(qū)動(dòng)詳解
- Python+unittest+DDT實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試
- python自動(dòng)化測(cè)試之DDT數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)代碼
- python ddt數(shù)據(jù)驅(qū)動(dòng)最簡(jiǎn)實(shí)例代碼
- python ddt實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)
- python中DDT數(shù)據(jù)驅(qū)動(dòng)的實(shí)現(xiàn)
相關(guān)文章
python將Dataframe格式的數(shù)據(jù)寫入opengauss數(shù)據(jù)庫(kù)并查詢
這篇文章主要介紹了python將Dataframe格式的數(shù)據(jù)寫入opengauss數(shù)據(jù)庫(kù)并查詢,文章介紹詳細(xì)具有一定的參考價(jià)值,希望對(duì)你的學(xué)習(xí)有所幫助2022-04-04
pytorch?tensor內(nèi)所有元素相乘實(shí)例
這篇文章主要介紹了pytorch?tensor內(nèi)所有元素相乘實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
python中使用enumerate函數(shù)遍歷元素實(shí)例
這篇文章主要介紹了python中使用enumerate函數(shù)遍歷元素實(shí)例,這是一個(gè)比較簡(jiǎn)單的例子,需要的朋友可以參考下2014-06-06
淺析python打包工具distutils、setuptools
python包在開發(fā)中十分常見,一般的使用套路是所有的功能做一個(gè)python模塊包,打包模塊,然后發(fā)布,安裝使用。這篇文章給大家介紹了python打包工具distutils、setuptools的相關(guān)知識(shí),感興趣的朋友一起看看吧2018-04-04
Python數(shù)據(jù)存儲(chǔ)之 h5py詳解
今天小編就為大家分享一篇Python數(shù)據(jù)存儲(chǔ)之 h5py詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
詳解Django項(xiàng)目中模板標(biāo)簽及模板的繼承與引用(網(wǎng)站中快速布置廣告)
這篇文章主要介紹了詳解Django項(xiàng)目中模板標(biāo)簽及模板的繼承與引用【網(wǎng)站中快速布置廣告】,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03

