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自动登录126邮箱的方法
Jul 10 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
python实现k-means聚类算法
Feb 23 Python
详解django2中关于时间处理策略
Mar 06 Python
用scikit-learn和pandas学习线性回归的方法
Jun 21 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
Python 列表的清空方式
Jan 13 Python
Python如何用filter函数筛选数据
Mar 05 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
Python进行特征提取的示例代码
Oct 15 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
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
php使用pack处理二进制文件的方法
2014/07/03 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
重定向实现代码
2006/11/20 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python实现类的创建与使用方法示例
2017/07/25 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
儿童python练习实例
2018/05/27 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
python绘制动态曲线教程
2020/02/24 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
几道PHP的面试题
2012/05/19 面试题
市场专员岗位职责
2014/02/14 职场文书
美容院营销方案
2014/03/05 职场文书
项目负责人岗位职责
2015/02/15 职场文书
教师节老师寄语
2015/05/28 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书