python ddt数据驱动最简实例代码


Posted in Python onFebruary 22, 2019

在接口自动化测试中,往往一个接口的用例需要考虑 正确的、错误的、异常的、边界值等诸多情况,然后你需要写很多个同样代码,参数不同的用例。如果测试接口很多,不但需要写大量的代码,测试数据和代码柔合在一起,可维护性也会变的很差。数据驱动可以完美的将代码和测试数据分开,将代码进行分装,提高复用性,测试数据维护在本地文件或数据库。

使用python做接口自动化,首要任务是搭建一个自动化测试框架,其中unittest+ddt是一个不错的选择,下文主要介绍ddt在unittest下的使用。

ddt包含两个方法装饰器 ddt.data 和 ddt.file_data

一、ddt.data(直接输入测试数据)

ddt.unpack 的作用是把参数中 元祖 或者 列表 的元素对应到多个参数上,没有加 ddt.unpack 表示把 元祖 或者 列表本身当成一个参数传入。

下面这段代码,ddt.data() 有三组测试数据,每组测试数据都会执行一次 test_login() 。

import json
import unittest
from common.readConfig import readConfig
import requests
from ddt import ddt,data,file_data,unpack

@ddt  # 在测试类前必须首先声明使用 ddt.ddt
class Mytest(unittest.TestCase):
  def setUp(self):
    # 获取测试接口的url
    self.url = readConfig().getHttp('usercenter') + readConfig().get_UC('login')print('setup')

  @data(({"isRememberMe": True ,"password": "111111","username": "root"},200),
     ({"isRememberMe": True, "password": "1111111", "username": "root"},406),
     ({"isRememberMe": True, "password": "111111", "username": "rot"},406))
  @unpack
  # 后台人员登录
  def test_login(self,data,status):
    body = json.dumps(data)
    header = {"Content-Type":"application/json","Accept": "application/json","token": "1231"}
    re = requests.post(self.url,data=body,headers = header,verify = False)
    code = re.status_code
    print(re.text,re.status_code)
    # 断言
    self.assertEqual(int(status),int(code))

  def tearDown(self):
    print('tearDown')

if __name__ == '__main__':
  unittest.main()

二、ddt.file_data (参数是文件名。文件可以是json 或者 yaml类型)

如果文件中是列表,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。如果文件中是字典,字典的key会作为测试用例方法的后缀显示,字典的值会作为测试用例参数。下文两种类型的文件分别举一个例子。

新建文件testdata.json:

{
  "first": ["{'isRememberMe': True,'password': '111111','username': 'root'}", "200"],
  "second": ["{'isRememberMe': True, 'password': '1111111', 'username': 'root'}", "406"],
  "third": ["{'isRememberMe': True, 'password': '111111', 'username': 'rot'}", "406"]
}

新建文件testdata.yaml:

first: ["{'isRememberMe': True,'password': '111111','username': 'root'}","200"]

second: ["{'isRememberMe': True, 'password': '1111111', 'username': 'root'}", "406"]

third: ["{'isRememberMe': True, 'password': '111111', 'username': 'rot'}", "406"]

新建测试脚本:

import json
import unittest
from common.readConfig import readConfig
import requests
from ddt import ddt,data,file_data,unpack

@ddt  # 在测试类前必须首先声明使用 ddt.ddt
class Mytest(unittest.TestCase):
  def setUp(self):
    # 获取测试接口的url
    self.url = readConfig().getHttp('usercenter') + readConfig().get_UC('login')print('setup')

  @file_data('D:\\automation--interface\\testcase\\UC\\testdata.json')
  # @file_data('D:\\automation--interface\\testcase\\UC\\testdata.yaml')

  # 后台人员登录
  def test_login(self,data):
    body = json.dumps(eval(data[0]))
    status = data[1]
    header = {"Content-Type":"application/json","Accept": "application/json","token": "1231"}
    re = requests.post(self.url,data=body,headers = header,verify = False)
    code = re.status_code
    print(re.text,re.status_code)
    # 断言
    self.assertEqual(int(status),int(code))

  def tearDown(self):
    print('tearDown')

if __name__ == '__main__':
  unittest.main()

以上代码大家可以本地测试下,感谢同学们的学习和对三水点靠木的支持。

Python 相关文章推荐
Python检测字符串中是否包含某字符集合中的字符
May 21 Python
Python实现批量修改文件名实例
Jul 08 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
浅谈python中requests模块导入的问题
May 18 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
python 实现音频叠加的示例
Oct 29 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 Python
Python自动化测试PO模型封装过程详解
Jun 22 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 #Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 #Python
pandas修改DataFrame列名的实现方法
Feb 22 #Python
pyhanlp安装介绍和简单应用
Feb 22 #Python
Python3.7 dataclass使用指南小结
Feb 22 #Python
Python文件读写常见用法总结
Feb 22 #Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 #Python
You might like
综合图片计数器
2006/10/09 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
Node.js实现数据推送
2016/04/14 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
Python的标准模块包json详解
2017/03/13 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
合同意向书范本
2014/07/30 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis