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线程池的实现实例
Nov 18 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
SQLite3中文编码 Python的实现
Jan 11 Python
Django 视图层(view)的使用
Nov 09 Python
基于Python打造账号共享浏览器功能
May 30 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
5行Python代码实现图像分割的步骤详解
May 25 Python
如何通过python检查文件是否被占用
Dec 18 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 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无限分类源码分享(思路不错)
2011/10/13 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
捕获关闭窗口的脚本
2009/01/10 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
Python urllib3软件包的使用说明
2020/11/18 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
初中同学聚会邀请函
2014/02/03 职场文书
保险内勤岗位职责
2014/04/05 职场文书
商务经理岗位职责
2014/07/30 职场文书
党员检讨书
2014/10/13 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
求职意向书范本
2015/05/11 职场文书
Nginx反向代理配置的全过程记录
2021/06/22 Servers
POST提交数据常见的四种方式
2022/01/18 HTML / CSS
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle