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实现备份目录的方法
Aug 03 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
python去掉行尾的换行符方法
Jan 04 Python
Python 多进程和数据传递的理解
Oct 09 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
TensorFlow如何实现反向传播
Feb 06 Python
Python入门之后再看点什么好?
Mar 05 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
PyTorch中permute的用法详解
Dec 30 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 Python
通过实例解析python描述符原理作用
Jan 22 Python
解决python Jupyter不能导入外部包问题
Apr 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
PHP提取中文首字母
2008/04/09 PHP
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
vue实现循环切换动画
2018/10/17 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
JS实现放大镜效果
2020/09/21 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
Python中类型关系和继承关系实例详解
2015/05/25 Python
python paramiko模块学习分享
2017/08/23 Python
对python中的pop函数和append函数详解
2018/05/04 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
公司捐款倡议书
2014/05/14 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
老兵退伍标语
2014/10/07 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
浅谈Web Storage API的使用
2021/06/23 Javascript
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python