python的ddt用法,python ddt数据驱动详解
1.DDT模块介绍(数据驱动)数据驱动测试(DDT),即黑盒测试,可以实现不同的数据可以运行同一个测试用例(不同的测试结果由不同的数据驱动),最终实现数据和脚本的分离,便于维护和扩展。它是一种主要的设计模式,也是中级和高级自动化测试的必要技能。
ddt的本质其实是一个装饰器,一组数据,一个场景。
Ddt模块包含一个类decorator ddt(@ddt)和三个方法decorator(@ data、@unpack、@file_data),其中:
@data:包含要传递给测试用例的多个参数,可以是单个参数,比如list、tuple、dictionary等。会用逗号分隔成多组数据,依次传递给测试用例;
@file_data:数据将从json或yaml加载(注意如果文件以“.”结尾。yml“或”。yaml”,ddt将被视为yaml类型,其他所有文件将被视为json文件。例如txt文件)
@unpack: split elements(需要配合unittest测试框架实现黑盒测试)
黑盒测试:
1.避免编写重复的代码。
2.从测试脚本中分离数据
3.通过使用黑盒测试来验证多组数据测试场景。
一般来说,多用于单元测试和接口测试。
第二,python使用ddt传递参数,需要安装:
pip安装ddt
# get_ddt.py
导入单元测试
从ddt导入ddt,数据,解压缩,文件数据
# ddt类装饰器
@ddt
类MyddtTest(unittest。测试用例):
# @data method decorator,数据会用逗号分隔,有几组数据,循环传入函数。
@data(1,2,3)
Test _ 01 (self,value): # value用于接受数据的数据。
打印(值)
# 1
# 2
# 3
@data([1,2],[3,4])
def test_02(自身,值):
打印(值)
# [1, 2]
# [3, 4]
@data([{name: peter , age: 15, addr :成都 }])
def test_03(自身,值):
打印(值)
# [{ 姓名:彼得,年龄:15,地址:成都 }]
# @unpac拆分相当于去掉了数据最外层的结构,拆分了数据装饰器发送的数据。
@data([5,6],[7,8])
@解包
定义测试_04(自身,值1,值2):
打印(值1,值2)
# 5 6
# 7 8
#多个列表词典,拆分
@data([{name:peter , age:16, addr :成都 },{name:lily , age:17, addr :成都 }])
@解包
定义测试_05(自身,值1,值2):
打印(值1,值2)
# { 姓名:彼得,年龄:16,地址:成都 } { 姓名:百合,年龄:17,地址:成都 }
#单本词典,拆分
# @data中的数据关键字必须与字典中的关键字一致
@data({name:jack , age:20})
@解包
def test_06(本人,姓名,年龄):
打印(姓名、年龄)
#杰克20
#多个字典,拆分
@data({ 姓名:彼得,年龄:18,地址:成都 },{ 姓名:百合,年龄:19,地址:成都 })
@解包
def test_07(本人,姓名,年龄,地址):
打印(姓名、年龄、地址)
#彼得18成都
#百合19成都
if __name__==__main__ :
Unittest.main () III。ddt读取文件1.ddt读取yaml文件和json文件。
# config.json
{
stu1 :
姓名:彼得,
年龄:29岁,
地址:北京
},
stu2 :
姓名:杰克,
年龄:30,
地址:深圳
}
}conf.json
# config.yaml
# Use-为了分离用例,那么yaml读取的数据类型是列表。
-
型号:注册模块
标题:注册成功
网址:http://api.nnzhp.cn/api/user/user_reg
方法:邮寄
数据:
用户名:yingcr10
密码:Ace123456
cpwd: Ace123456
检查:
错误代码:0
消息:注册成功!
-
型号:注册模块
标题:用户名长度小于6位,注册失败。
网址:http://api.nnzhp.cn/api/user/user_reg
方法:邮寄
数据:
用户名:yingc
密码:Ace123456
cpwd: Ace123456
检查:
错误代码:3002config.yaml
# get_ddt.pyimport单元测试
导入单元测试
从ddt导入ddt,数据,解压缩,文件数据
#声明ddt类装饰器
@ddt
类MyddtTest(unittest。测试用例):
# @file_data加载json文件
#模式1:可变长度参数接收
@file_data(config.json )
def test_10(self,**testdata): # **testdata:将提取到的数据存放在空字典测试数据中
# 再从字典测试数据中单独提取参数
# name=testdata[name]
# age=testdata[age]
# addr=testdata[addr]
#打印(姓名、年龄、地址)
打印(测试数据)#会运行两次
# { 姓名:彼得,年龄:29,地址:北京 }
# { 姓名:杰克,年龄:30,地址:深圳 }
# 方拾二:指名道姓的接收,测试()方法中的参数必须与数据文件中的键保持一致
@file_data(config.json )
定义测试_11(自己,姓名,年龄,地址):
名称=名称
年龄=年龄
地址=地址
打印(姓名、年龄、地址)
#彼得29北京
深圳杰克30号
# @file_data加载格式文件
# 方式一:可变长参数接收
@file_data(config.yaml )
def test_12(self,**testdata):# **testdata:将提取到的数据存放在空字典测试数据中
# 再从字典测试数据中单独提取参数
# model=testdata[model]
# title=testdata[title]
#打印(型号、标题)
打印(测试数据)
# { 模型: 注册模块,标题: 注册成功, URL : http://API。nnzhp。cn/API/user/user _ reg , method: POST , data: {username: yingcr10 , pwd: Ace123456 , cpwd: Ace123456}, check: {error_code: 0, msg :注册成功!}}
# { 模型: 注册模块,标题: 用户名长度小于6位,注册失败, URL : http://API。nnzhp。cn/API/user/user _ reg , method: POST , data: {username: yingc , pwd: Ace123456 , cpwd: Ace123456}, check: {error_code: 3002}}
# 方式二:指名道姓的接收,方法中的参数必须与格式文件中的键保持一致
@file_data(config.yaml )
定义测试_13(自身,模型,标题,网址,方法,数据,检查):
用户名=数据[用户名]
pwd=data[pwd]
cpwd=data[pwd]
打印(模型、标题、网址、方法、数据、检查)
打印(用户名、密码、密码)
# 注册模块注册成功http://api.nnzhp.cn/api/user/user_reg邮报{ username : yigr 10 , pwd: Ace123456 , cpwd : ace 123456 } { error _ code :0, msg :注册成功!}
#英10 Ace123456 Ace123456
# 注册模块用户名长度小于6位,注册失败http://api.nnzhp.cn/api/user/user_reg邮报{ 用户名:英奇,密码: Ace123456 , cpwd: Ace123456} { 错误代码:3002}
#英中Ace123456
if __name__==__main__ :
unittest.main()2.ddt读取超过文件思路:先从超过文件中读取数据,然后再用二氯二苯三氯乙烷加载已读取的数据
第一步:读取超过
# get_excel.py
从安装导入加载_工作簿
class ExcelData():
def __init__(self,file=config.xlsx ):
初始化超过对象
self.file=file
自我。WB=load _ workbook(self。文件)
def get_row_value(self,row,sheet_name=Sheet1 ):
获取超过中某一行的数据
sh=自我。世行[工作表名称]
max_col=sh.max_column
row_value=[]
对于范围内的列(1,max_col 1):
value=sh.cell(行,列)。价值
行值.追加(值)
返回行值
def get_all_row(self,sheet_name=Sheet1 ):
获取超过中所有行的数据,并存放在列表中
sh=自我。世行[工作表名称]
max_row=sh.max_row
row_value=[]
对于范围内的行(2,max_row 1):
value=self.get_row_value(row)
行值.追加(值)
返回行值
if __name__==__main__ :
excel=ExcelData()
testdata=excel.get_all_row()
打印(测试数据)第二步:使用二氯二苯三氯乙烷使用读取好的数据
# get_ddt.py
导入请求
导入单元测试
从二氯二苯三氯乙烷导入滴滴涕,数据,解压缩,文件数据
从获取_excel导入ExcelData
@ddt
类SignTest(单元测试.测试用例):
# 从get_excel.py中读取测试数据
excel=ExcelData()
testdata=excel.get_all_row()
@data(*testdata)
定义测试符号(自身,数据):
# 由于从超过中读取到的数据为列表形式,所以采用下标来提取各参数
ID=datas[0]
模型=数据[1]
title=datas[2]
方法=数据[3]
url=datas[4]
用户名=数据[5]
pwd=datas[6]
cpwd=datas[7]
check=datas[8]
body={
用户名:用户名,
密码:密码,
cpwd: cpwd
}
self.sign_test(ID,模型,标题,url,方法,主体,检查)
def sign_test(自身,ID,模型,标题,url,方法,主体,检查):
打印(用例ID:,ID)
打印(模块:,型号)
打印(用例标题:,标题)
response=requests . request(URL=URL,method=method,data=body)。文本
尝试:
#通过断言,比较实际结果与预期结果是否一致
#因为从excel中读取的校验是str类型的,所以响应不需要转换成dict,可以直接断言比较是否相等。
断言检查==响应
打印(“测试通过”)
例外情况为e:
打印(“测试失败”)
提高e
if __name__==__main__ :
Unittest.main()结果:
运行结果:
用例ID: 001
模块:注册模块
标题:用户名和密码正确,注册成功。
测试通过了。
用例ID: 002
模块:注册模块
标题:用户名长度小于6位,注册失败。
测试通过了。
好
-
在0.190秒内运行2次测试
进程结束,退出代码0查看代码
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。