简单介绍

​ DDT(Date Driver Test),所谓数据驱动测试,简单来说就是由数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,避免在测试中使用硬编码的数据,也就是测试数据和用例脚本代码分离。

​ DDT它其实就是一个装饰器,它会根据你传递进来的数据来决定要生成几个测试用例。

使用的意义

1.代码复用率高:一个测试逻辑只需要写一次,可以多条测试数据复用,同时提高测试脚本的编写效率。

2.异常排查效率高:根据测试数据,每条数据生成一条测试用例,用例相互分离,一条失败的情况下不会影响其他测试用例。

3.代码可维护性高:简洁明了的测试框架,利于其他同事阅读,提高代码的可维护性。

安装及导入

​ cmd命令行执行安装:pip install ddt

​ 直接导入到模块:import ddt,或导入具体的装饰器:from ddt import ddt, data,unpack

ddt使用详解

三个要点

  • @ddt:装饰测试类
  • @data:装饰测试用例
  • @unpack:装饰测试用例

​ 要使用ddt的前提是要有测试用例类,然后用@ddt去装饰测试用例类,用@data(测试数据)去装饰测试用例,如下登录接口例子:

from ddt import ddt, data
from common.read_excel import ReadExcel
from common.my_logger import log @ddt # 装饰登录测试用例类,声明使用ddt
class LoginTestCase(unittest.TestCase): excel = ReadExcel("cases.xlsx", "login")
cases = excel.read_data() @data(*cases) # 装饰测试用例
def test_login(self, case):
case_data = eval(case["data"])
expected = eval(case["expected"])
case_id = case["case_id"]
result = login_check(*case_data)
response = self.http.send(url=url, method=method, json=data, headers=headers)
result = response.json()
try:
self.assertEqual(expected["code"], result["code"])
self.assertEqual((expected["msg"]), result["msg"])
except AssertionError as e:
log.info("用例:{}--->执行未通过".format(case["title"]))
print("预期结果:{}".format(expected))
print("实际结果:{}".format(result))
raise e
else:
log.info("用例:{}--->执行通过".format(case["title"])) if __name__ == '__main__':
unittest.main()

@ddt它做的事情其实就等同于这句代码:LoginTestCase = ddt(LoginTestCase),把具体的类名传给ddt,告诉ddt是这个测试用例类要使用数据驱动。

@data做的事情就是把测试数据作为一个参数传递给测试用例,一个数据对应生成一条测试用例,如果data里面有多个数据那么就对应生成多条测试用例。如果data里放的类似是元组、列表等这样的序列类型的数据,data会把他们当成是一个整体,即一个测试数据。

​ 如果想一次传递多个参数给测试用例,需要自行在脚本中对数据进行分解或者使用@unpack分解数据。如上例子中的测试用例,只使用了一个参数,但这个参数case是一个字典,字典中已经包含多个数据,直接用key获取对应的值即可。@unpack则是可以把序列类型的数据拆分为多个,以多个参数传给测试用例,但测试用例也需要定义同等数量的参数来接收。

​ 上面例子的测试数据cases来源是使用了openpyxl来读取excel中的测试数据的,关于openpyxl可以看我这个系列的另外一篇随笔。这里直接说明cases其实就是像下面这样的一个列表:

cases = [{'case_id': 1, 'title': '正常登录', 'data': '("test", "Test1234")', 'expected': '{"code": 0, "msg": "登录成功"}'}, {'case_id': 2, 'title': '密码错误', 'data': '("test", "123")', 'expected': '{"code": 1, "msg": "账号或密码不正确"}'}, {'case_id': 3, 'title': '账户名错误', 'data': '("test11", "Test1234")', 'expected': '{"code": 1, "msg": "账号或密码不正确"}'}]

# *解包后,一个字典就是一个测试用例数据
# 如第一个字典:{'case_id': 1, 'title': '正常登录', 'data': '("test", "Test1234")', 'expected': '{"code": 0, "msg": "登录成功"}'}

​ 通过*解包,它的数据就是3个字典,每次给测试用例传入1个字典,而这个字典里就存放了一条完整的登录接口测试用例的测试数据,包括用例id、用例标题、测试的账号密码、期望返回的结果。

小结:

  • @data(a,b):a和b各运行一次用例
  • @data(*(a,b):a和b各运行一次用例,使用*解包,相当于@data(a,b)
  • @data([a,d],[c,d])
    • 如果没有@unpack[a,b]、[c,d]都会被当成一个参数传入用例,即用[a,b]运行一次,用[c,d]运行一次;
    • 如果有@unpack,[a,b]会被分解开,一次传递两个参数给用例,用例需要定义两个参数接收
    • @unpack可适用元组、列表或字典,但当传入的是字典时,字典的key和用例定义的参数名需要保持一致

扩展

关键代码@file_data,传递文件(json/yaml)

# 传递json
"""
json文件数据
{
"token":123456,
"actionName": "api.login",
"content": {
"user": "miki",
"pwd": "Test123"
}
}
"""
"""
yaml文件
test_list:
- 11
- 22
- 12 sorted_list: [ 11, 12, 22 ]
"""
from ddt import * @ddt # 声明使用ddt
class TestFile(unittest.TestCase): @file_data('D:/test/test.json')
def test_json(self, json_data):
print(json_data) @file_data('D:/test/test.yaml')
def test_yaml(self, yaml_data):
print("yaml", yaml_data)

【python接口自动化】- DDT数据驱动测试的更多相关文章

  1. python接口自动化9-ddt数据驱动

    前言 ddt:数据驱动,说的简单一点,就是多组测试数据,比如点点点的时候登录输入正常.异常的数据进行登录. 实际项目中,自动化测试用得很少,但也有人用excel来维护测试数据 一.ddt 1.安装:p ...

  2. python Unittest+excel+ddt数据驱动测试

    #!user/bin/env python # coding=utf- # @Author : Dang # @Time : // : # @Email : @qq.com # @File : # @ ...

  3. 2020年第二期《python接口自动化+测试开发》课程,已开学!

    2020年第二期<python接口自动化+python测试开发>课程,12月15号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:12月15号-3月29 ...

  4. python接口自动化28-requests-html爬虫框架

    前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...

  5. python接口自动化24-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  6. python接口自动化23-token参数关联登录(登录拉勾网)

    前言 登录网站的时候,经常会遇到传token参数,token关联并不难,难的是找出服务器第一次返回token的值所在的位置,取出来后就可以动态关联了 登录拉勾网 1.先找到登录首页https://pa ...

  7. Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要

    1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...

  8. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

  9. python接口自动化-Cookie_绕过验证码登录

    前言 有些登录的接口会有验证码,例如:短信验证码,图形验证码等,这种登录的验证码参数可以从后台获取(或者最直接的可查数据库) 获取不到也没关系,可以通过添加Cookie的方式绕过验证码 前面在“pyt ...

  10. python接口自动化-参数化

    原文地址https://www.cnblogs.com/yoyoketang/p/6891710.html python接口自动化 -参数关联(一)https://www.cnblogs.com/11 ...

随机推荐

  1. flask中的return、过滤器详解

    之前吧一直学习flask的时候,一直不明白response是怎么产生,今天是明白了.retrun  哎呀,这个地方看着挺小心的东西, 蕴含的能量可不小啊.今天我详细总结总结. 先来写jinjia2语法 ...

  2. 【题解】三角形 [P1222] / 三角形覆盖问题 [HNOI2012] [P3219]

    [题解]三角形 [P1222] / 三角形覆盖问题 [HNOI2012] [P3219] 传送门: 三角形 \(\text{[P1222]}\) 三角形覆盖问题 \(\text{[HNOI2012] ...

  3. Codeforces Edu Round 59 A-D

    A. Digits Sequence Dividing 注意特殊情况,在\(n = 2\)时除非\(str[1] >= str[2]\),否则可以把第一个数划分下来,剩下的数直接当成一组,一定满 ...

  4. 五、Zookeeper基于API操作Node节点

    安装zookeeper :linux下安装Zookeeper 3.4.14 zookeeper 分为5个包: org.apache.zookeeper //客户端主要类文件 org.apache.zo ...

  5. sql注入之文件写入into outfile

    sql注入中写入webshell的几种方式 sql注入中写入webshell的几种方式 secure_file_priv="c:/-"被注释掉或者是web路径 php.ini中的g ...

  6. 开源一套原创文本处理工具:Java+Bat脚本实现自动批量处理对账单工具

    原创/朱季谦 这款工具是笔者在2018年初开发完成的,时隔两载,偶然想起这款小工具,于是,决定将其开源,若有人需要做类似Java批处理实现整理文档的工具,可参考该工具逻辑思路来实现. 该工具是运行在w ...

  7. 【震惊】padding-top的百分比值参考对象竟是父级元素的宽度

    引言 书写页面样式与布局是前端工程师Coding 中必不可少的一项工作,在定义页面元素的样式时,padding 属性也是经常被使用到的. padding 属性用于设置元素的内边距,其值可以是lengt ...

  8. 使用Spark的newAPIHadoopRDD接口访问有kerberos认证的hbase

    使用newAPIHadoopRDD接口访问hbase数据,网上有很多可以参考的例子,但是由于环境使用了kerberos安全加固,spark使用有kerberos认证的hbase,网上的参考资料不多,访 ...

  9. 移动端 canvas统计图

    一.折线图 1. 获取画布画笔 2. 封装画线的方法 3. 画坐标轴 4. 循环数据画横轴 > 4.1 画刻度 > 4.2 刻度文字 > 4.3 画折线 > 4.4 画点 5. ...

  10. 阿里云视频点播之URL批量拉取上传(调整为多个视频上传)

    项目引入阿里云视频点播PHP-SDK 背景:2021年乐视云的点播将停止提供服务,项目决定选择选用阿里云的视频的点播.在上线前,需要将之前的视频提前导入资源库,URLS方式拉取是比较方便的,对编辑同事 ...