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 文件重命名工具代码
Jul 26 Python
python中sets模块的用法实例
Sep 30 Python
举例讲解Python中的算数运算符的用法
May 13 Python
Python下载懒人图库JavaScript特效
May 28 Python
python3 判断列表是一个空列表的方法
May 04 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
python绘制直线的方法
Jun 30 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
详解python UDP 编程
Aug 24 Python
python某漫画app逆向
Mar 31 Python
只用40行Python代码就能写出pdf转word小工具
May 31 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
PHP分页函数代码(简单实用型)
2010/12/02 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
python安装Scrapy图文教程
2017/08/14 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
python统计文章中单词出现次数实例
2020/02/27 Python
Python self用法详解
2020/11/28 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
Python如何实现单例模式
2016/06/03 面试题
采购员岗位职责
2013/11/15 职场文书
文化宣传方案
2014/03/13 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
项目投资建议书
2014/05/16 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android