網站首頁 編程語言 正文
1、數據驅動介紹:
- @ddt.ddt(類裝飾器,申明當前類使用ddt框架)
- @ddt.data(函數裝飾器,用于給測試用例傳遞數據),支持傳python所有數據類型:數字(int,long,float,compix),字符串,列表1ist,元組tuple,集合,編寫閱讀數據文件的函數、@data入口參數加*讀取
- @ddt.unpack(函致裝飾器,將傳輸的數據包解包),一般作用于元組tuple和列表list、字典(參數名字和個數需要與字典的鍵保持一致)(數組、字符串不需要)
- @ddt.file_data(函數裝飾器,可直接讀取yaml/json文件)
2、數據驅動和關鍵驅動的區別:
Data-Driven Tests(DDT)即數據驅動測試,可以實現不同數據運行同一個測試用例。ddt本質其實就是裝飾器,一組數據一個場景。
關鍵字驅動(核心:把業務邏相封裝成關鍵字login,只需要調用login。)
3、混合驅動模式(關鍵字驅動+數據驅動)
4、在進行數據驅動測試實戰:需要在測試類上使用@ddt.ddt裝飾器,在測試用例上使用@ddt.data裝飾器。
(1)單一參數:導包——寫一個參數(列表、數字、字符串)-----設置@ddt.data裝飾器寫入參數名----方法中寫入形參*data----調用參數內容
(2)多參數的數據驅動測試(一個測試參數中含多個元素):導包——設置@ddt裝飾器——設置@unpack解包——寫入參數——形參傳遞——調用
(3)txt文件傳參
(4)json文件傳參
(5)yaml文件傳參
(6)xlsx文件傳參
注意:Python中傳遞可變參數:*代表順序閱讀列表類型,**代表順序閱讀對象(字典)類型,點擊閱讀可變參數部分可了解相關機制
# 1、單一參數的數據驅動
# 前置步驟:
# 使用語句import unittest導入測試框架
# 使用語句from ddt import ddt, data導入單一參數的數據驅動需要的包
# 示例會執行三次test,參數分別為'666','777','888'
import ddt
import unittest
@ddt.ddt # 設置@ddt裝飾器
class BasicTestCase(unittest.TestCase):
@ddt.data('666', '777', '888') # 設置@data裝飾器,并將傳入參數寫進括號
def test(self, *data): # test入口設置形參
print('數據驅動的number:', data)
# 程序會執行三次測試,入口參數分別為666、777、888
# 2、多參數的數據驅動
# 在單一參數包的基礎上,額外導入一個unpack的包,from ddt import ddt, data, unpack
# 步驟:導包——設置@ddt裝飾器——設置@unpack解包——寫入參數——形參傳遞——調用
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': '用戶名或密碼錯誤'}},
]
@ddt.ddt
class BasicTestCase(unittest.TestCase):
#方式一:直接將列表放到data
@ddt.data(['張三', '18'], ['李四', '19']) # 設置@data裝飾器,并將同一組參數寫進中括號[]
@ddt.unpack # 設置@unpack裝飾器順序解包,缺少解包則相當于name = ['張三', '18']
def test(self, name, age):
print('姓名:', name, '年齡:', age)
# 程序會執行兩次測試,入口參數分別為['張三', '18'],['李四', '19']
#方式二:寫一個列表后,使用*訪問列表到data
@ddt.data(*Testdata)
@ddt.unpack # 設置@unpack裝飾器順序解包
def test_DataDriver(self, *Data):
#print('DDT數據驅動實戰演示:', Data)
res = login.login_check(Testdata['username'], Testdata['password'])
self.assertEqual(res, Testdata['excepted'])
#3、 txt文件接收參數
# 新建num文件,txt格式
# (1)單一參數按行存儲777,888,999
# (2)多參數txt文件
# dict文件內容(參數列表)(按行存儲):
# 張三,18
# 李四,19
# 編輯閱讀數據文件的函數
# 記住讀取文件一定要設置編碼方式,否則讀取的漢字可能出現亂碼!!!!!!
import ddt
import unittest
def read_num():
lis = [] # 以列表形式存儲數據,以便傳入@data區域
with open('num.txt', 'r', encoding='utf-8') as file: # 以只讀'r',編碼方式為'utf-8'的方式,打開文件'num',并命名為file
for line in file.readlines(): # 循環按行讀取文件的每一行
lis.append(line.strip('\n')) #單一參數,每讀完一行將此行數據加入列表元素,記得元素要刪除'/n'換行符!!!
#lis.append(line.strip('\n').split(',')) # 多參驅動,刪除換行符,根據,分割后,列表為['張三,18', '李四,19', '王五,20']
return lis # 將列表返回,作為@data接收的內容
@ddt.ddt
class BasicTestCase(unittest.TestCase):
@ddt.data(*read_num()) # 入口參數設定為read_num(),因為返回值是列表,所以加*表示逐個讀取列表元素
#txt表格有多少個值,設置多少個接收參數的形參
def test(self, name,age):
print('數據驅動的number:', name,age)
# 4、JSON文件傳參:數據分離
# 多參數——json文件
# 步驟和單一參數類似,僅需加入@unpack裝飾器以及多參數傳參入口
# dict文件內容(參數列表)(非規范json文件格式):
# 單一參數:["666","777","888"]
# 多個參數:[["張三", "18"], ["李四", "19"], ["王五", "20"]]
# 注意json文件格式字符串用雙引號
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): # 因為是非規范json格式,所以形參名無限制,下文會解釋規范json格式
print('姓名:', name, '年齡:', age)
# 4、JSON文件傳參:數據分離
# json文件三種形式:
# (1)單一參數:["666","777","888"]
# (2)多個參數:[["張三", "18"], ["李四", "19"], ["王五", "20"]]
# (3)JSON格式讀取,每一組參數以對象形式存儲:
# [
# {"name":"張三", "age":"18"},
# {"name":"李四", "age":"19"},
# {"name":"王五", "age":"20"}
# ]
# 單一參數時無需使用unpack,多參數需要使用unpack解包,注意json文件格式字符串用雙引號
import ddt
import unittest
import json
#方式1:非正式json格式使用
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格式有實例,方法一樣
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): # 因為是非規范json格式,所以形參名無限制,下文會解釋規范json格式
print('姓名:', name, '年齡:', age)
#5、多參數yaml
# 以對象形式存儲yml數據(字典)
# yaml格式文件內容
# -
# name: 張三
# age: 18
# -
# name: 李四
# age: 19
# -
# name: 王五
# age: 20
# '-'號之后一定要打空格!!!
# ':'號之后一定要打空格!!!
# 入口參數與數據參數key命名統一即可導入
import ddt
import unittest
import yaml
@ddt.ddt
class BasicTestCase(unittest.TestCase):
#方式1:形參入口和數據參數key命名統一
@ddt.file_data('./data/dict.yml')
def test(self, name, age): # 設置入口參數名字與數據參數命名相同即可
print('姓名是:', name, '年齡為:', age)
#方式2:入口參數與數據參數命名不統一
@ddt.file_data('./data/dict.yml')
def test(self, **cdata): # Python中可變參數傳遞的知識:**按對象順序執行
print('姓名是:', cdata['name'], '年齡為:', cdata['age']) # 通過對象訪問語法即可調用
例子如下:
方式一:測試數據直接寫成列表形式,使用ddt.data(*Data)傳值
##2.12.2 DDT在自動化測試中的應用(傳列表)
import ddt
import unittest
# 給4條測試數據
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': '用戶名或密碼錯誤'}},
]
@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數據驅動實戰演示:',Testdata)
res = login.login_check(Testdata['username'], Testdata['password'])
self.assertEqual(res, Testdata['excepted'])
if __name__ == '__main__':
unittest.main()
方式二:數據寫到方法形式readData(),使用ddt.data(*readData())傳值
import ddt
import unittest
# 給4條測試數據
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': '用戶名或密碼錯誤'}},
]
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數據驅動實戰演示:',Testdata)
res = login.login_check(Testdata['username'], Testdata['password'])
self.assertEqual(res, Testdata['excepted'])
if __name__ == '__main__':
unittest.main()
原文鏈接:https://blog.csdn.net/mengluzhixing/article/details/129212023
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-15 Python?print函數:如何將對象打印輸出_python
- 2022-06-12 C語言詳解float類型在內存中的存儲方式_C 語言
- 2023-05-09 python中類的相互調用的實踐_python
- 2022-12-08 Python中的pandas庫簡介及其使用教程_python
- 2022-10-19 Android項目中引入aar包的正確方法介紹_Android
- 2022-08-12 python利用scatter繪畫散點圖_python
- 2022-04-12 .NET 6 ‘Unable to configure HTTPS endpoint...
- 2022-08-02 c#中task與thread的區別及使用講解_C#教程
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支