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 相关文章推荐
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
May 05 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
python递归函数绘制分形树的方法
Jun 22 Python
python处理两种分隔符的数据集方法
Dec 12 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
python 字符串追加实例
Jul 20 Python
python多线程使用方法实例详解
Dec 30 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
Python 处理日期时间的Arrow库使用
Aug 18 Python
python re模块和正则表达式
Mar 24 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 和 MySQL 开发的 8 个技巧
2006/10/09 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP入门教程之会话控制技巧(cookie与session)
2016/09/11 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
js控制框架刷新
2008/08/01 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Python队列的定义与使用方法示例
2017/06/24 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
大专生自荐信
2013/10/04 职场文书
员工考核评语大全
2014/04/26 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
地道战观后感2000字
2015/06/04 职场文书