51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 734|回复: 0
打印 上一主题 下一主题

[转贴] 测试框架Unitest之参数化 - ddt 数据驱动模块详解(上)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-3 17:01:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zxdznb 于 2022-8-3 17:17 编辑

一、DDT模块(数据驱动)介绍

Data-Driven Tests(DDT)即数据驱动测试,可以实现不同数据运行同一个测试用例(通过数据的不同来驱动测试结果的不同),最终实现数据与脚本的分离,便于维护与扩展,它是一种主要设计模式,也是中高级自动化测试必备技能
ddt 本质其实就是装饰器,一组数据一个场景。
ddt模块包含了一个类的装饰器ddt(@ddt)和三个方法的装饰器(@data、@unpack、@file_data),其中:
  @data:包含多个你想要传给测试用例的参数,可以为单个参数,列表、元组、字典等,会以逗号分隔为多组数据依次传入测试用例;
  @file_data:会从json或yaml中加载数据(注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件处理。如txt文件)
  @unpack:分割元素(需要搭配unittest测试框架使用,实现数据驱动测试)

数据驱动测试:
1、避免编写重复代码
2、数据与测试脚本分离
3、通过使用数据驱动测试,来验证多组数据测试场景
通常来说,多用于单元测试和接口测试

二、python使用ddt传递参数
需要安装:
  1. pip install ddt
复制代码
范例如下:
  1. # get_ddt.py

  2. import unittest
  3. from ddt import ddt, data, unpack, file_data

  4. # ddt类装饰器++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5. @ddt
  6. class MyddtTest(unittest.TestCase):

  7.     # @data方法装饰器,会将数据以逗号分隔,有几个就是几组数据,循环传入函数++++++++++++++++++++++++++++++++++++++
  8.     @data(1,2,3)
  9.     def test_01(self, value):   # value用来接受data的数据
  10.         print(value)
  11.         # 1
  12.         # 2
  13.         # 3

  14.     @data([1,2],[3,4])
  15.     def test_02(self, value):
  16.         print(value)
  17.         # [1, 2]
  18.         # [3, 4]

  19.     @data([{"name": "peter", "age": 15, "addr": "chengdu"}])
  20.     def test_03(self, value):
  21.         print(value)
  22.         # [{'name': 'peter', 'age': 15, 'addr': 'chengdu'}]

  23.     # @unpac拆分,相当于把数据的最外层结构去掉,data装饰器传过来的数据进行拆分++++++++++++++++++++++++++++++++++++++
  24.     @data([5,6],[7,8])
  25.     @unpack
  26.     def test_04(self, value1, value2):
  27.         print(value1, value2)
  28.         # 5 6
  29.         # 7 8

  30.     # 多个列表字典,拆分
  31.     @data([{"name":"peter","age":16,"addr":"chengdu"},{"name":"lily","age":17,"addr":"chengdu"}])
  32.     @unpack
  33.     def test_05(self, value1, value2):
  34.         print(value1, value2)
  35.         # {'name': 'peter', 'age': 16, 'addr': 'chengdu'} {'name': 'lily', 'age': 17, 'addr': 'chengdu'}

  36.     # 单个字典,拆分
  37.     # @data里的数据key必须与字典的key保持一致
  38.     @data({"name":"jack","age":20})
  39.     @unpack
  40.     def test_06(self, name, age):
  41.         print(name, age)
  42.         # jack 20

  43.     # 多个字典, 拆分
  44.     @data({"name":"peter","age":18,"addr":"chengdu"},{"name":"lily","age":19,"addr":"chengdu"})
  45.     @unpack
  46.     def test_07(self, name, age, addr):
  47.         print(name, age, addr)
  48.         # peter 18 chengdu
  49.         # lily 19 chengdu


  50. if __name__ == '__main__':
  51.     unittest.main()
复制代码
三、ddt读取文件

1.ddt读取yaml文件和json文件
  1. # config.json

  2. {
  3.   "stu1": {
  4.     "name": "Peter",
  5.     "age": 29,
  6.     "addr": "BeiJing"
  7.   },
  8.   "stu2": {
  9.     "name": "Jack",
  10.     "age": 30,
  11.     "addr": "ShenZhen"
  12.   }
  13. }
复制代码
  1. # config.yaml

  2. # 使用-分隔用例,则yaml读取到的数据类型为列表
  3. -
  4.   model: 注册模块
  5.   title: 注册成功
  6.   url: http://api.nnzhp.cn/api/user/user_reg
  7.   method: POST
  8.   data:
  9.     username: yingcr10
  10.     pwd: Ace123456
  11.     cpwd: Ace123456
  12.   check:
  13.     error_code: 0
  14.     msg: 注册成功!
  15. -
  16.   model: 注册模块
  17.   title: 用户名长度小于6位,注册失败
  18.   url: http://api.nnzhp.cn/api/user/user_reg
  19.   method: POST
  20.   data:
  21.     username: yingc
  22.     pwd: Ace123456
  23.     cpwd: Ace123456
  24.   check:
  25.     error_code: 3002
复制代码
  1. # get_ddt.pyimport unittest
  2. import unittest
  3. from ddt import ddt, data, unpack, file_data

  4. # 声明了ddt类装饰器
  5. @ddt
  6. class MyddtTest(unittest.TestCase):

  7.     # @file_data加载json文件++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  8.     # 方式一:可变长参数接收
  9.     @file_data("config.json")
  10.     def test_10(self, **testdata): # **testdata:将提取到的数据存放在空字典testdata中
  11.         # 再从字典testdata中单独提取参数
  12.         # name = testdata['name']
  13.         # age = testdata['age']
  14.         # addr = testdata['addr']
  15.         # print(name, age, addr)
  16.         print(testdata) # 会运行两次
  17.         # {'name': 'Peter', 'age': 29, 'addr': 'BeiJing'}
  18.         # {'name': 'Jack', 'age': 30, 'addr': 'ShenZhen'}

  19.     # 方拾二:指名道姓的接收, test()方法中的参数必须与json文件中的键保持一致
  20.     @file_data("config.json")
  21.     def test_11(self,name, age, addr):
  22.         name = name
  23.         age = age
  24.         addr = addr
  25.         print(name, age, addr)
  26.         # Peter 29 BeiJing
  27.         # Jack 30 ShenZhen

  28.     # @file_data加载yaml文件+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  29.     # 方式一:可变长参数接收
  30.     @file_data("config.yaml")
  31.     def test_12(self, **testdata):# **testdata:将提取到的数据存放在空字典testdata中
  32.         # 再从字典testdata中单独提取参数
  33.         # model = testdata['model']
  34.         # title = testdata['title']
  35.         # print(model, title)
  36.         print(testdata)
  37.         # {'model': '注册模块', 'title': '注册成功', 'url': 'http://api.nnzhp.cn/api/user/user_reg', 'method': 'POST', 'data': {'username': 'yingcr10', 'pwd': 'Ace123456', 'cpwd': 'Ace123456'}, 'check': {'error_code': 0, 'msg': '注册成功!'}}
  38.         # {'model': '注册模块', 'title': '用户名长度小于6位,注册失败', 'url': 'http://api.nnzhp.cn/api/user/user_reg', 'method': 'POST', 'data': {'username': 'yingc', 'pwd': 'Ace123456', 'cpwd': 'Ace123456'}, 'check': {'error_code': 3002}}

  39.     # 方式二:指名道姓的接收,方法中的参数必须与yaml文件中的键保持一致
  40.     @file_data("config.yaml")
  41.     def test_13(self, model, title, url, method, data, check):
  42.         username = data['username']
  43.         pwd = data['pwd']
  44.         cpwd = data['pwd']
  45.         print(model, title, url, method, data, check)
  46.         print(username, pwd, cpwd)
  47.         # 注册模块 注册成功 http://api.nnzhp.cn/api/user/user_reg POST {'username': 'yingcr10', 'pwd': 'Ace123456', 'cpwd': 'Ace123456'} {'error_code': 0, 'msg': '注册成功!'}
  48.         # yingcr10 Ace123456 Ace123456

  49.         # 注册模块 用户名长度小于6位,注册失败 http://api.nnzhp.cn/api/user/user_reg POST {'username': 'yingc', 'pwd': 'Ace123456', 'cpwd': 'Ace123456'} {'error_code': 3002}
  50.         # yingc Ace123456 Ace123456


  51. if __name__ == "__main__":
  52.     unittest.main()
复制代码
转载:python ddt模块的使用 - www.pu - 博客园 (cnblogs.com)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-28 21:21 , Processed in 0.063835 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表