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控制台英汉汉英电子词典
Apr 23 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
Python判断两个对象相等的原理
Dec 12 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
flask session组件的使用示例
Dec 25 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
Python-ElasticSearch搜索查询的讲解
Feb 25 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
python实现按关键字筛选日志文件
Dec 24 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
python3 删除所有自定义变量的操作
Apr 08 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
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
javascript window对象属性整理
2009/10/24 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
BootStrap selectpicker
2016/06/20 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
python sort、sorted高级排序技巧
2014/11/21 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python绘制多个子图的实例
2019/07/07 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Python实现扫码工具的示例代码
2020/10/09 Python
日本小田急百货官网:Odakyu
2018/07/19 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
汽车专业学生自我评价
2014/01/19 职场文书
超市店庆活动方案
2014/08/31 职场文书
大学生毕业个人总结
2015/02/15 职场文书