python的ddt用法,python ddt数据驱动详解

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: