Python3|ddt|unittest|浅议数据驱动测试
1、DDT简介
Data-Driven Tests(DDT)即数据驱动测试。它允许您通过不同的测试数据来运行同一个测试用例,使它作为多个测试用例出现。其官方文档给出的定义如下:
DDT (Data-Driven Tests) allows you to multiply one test case by running it with different test data, and make it appear as multiple test cases.
DDT的经典使用场景之一是:测试用例的代码不变,只有测试数据在变化。DDT作为第三方库,使用前需要先安装:
sudo pip3 install ddt
2、data装饰器
@data()是一个装饰器,它包含了您想提供给测试方法的值,个数和测试方法参数一样多。使用方法:在测试类(继承于unittest.TestCase)上面设置装饰器@ddt,在测试方法上设置装饰器@data()
[示例1] @data
#coding:utf-8
import unittest
#从ddt模块导入装饰器ddt,file_data,unpack,data
from ddt import ddt,file_data,unpack,data
@ddt
#定义测试类BoolTest
class BoolTest(unittest.TestCase):
@data(1,"hello",3>2)
def test_true_001(self,value):
self.assertTrue(value)
@data("",1>2,{})
def test_false_002(self,value):
self.assertFalse(value)
if __name__ == "__main__":
unittest.main()
示例1运行结果如下:
我们只编写了两个测试方法,但是通过6组不同的测试数据,最终可以达到运行6个测试用例的目的。这就是数据驱动测试的强大之处。再来看一个多个输入值的示例。
@unpack 自动解压元组,列表到多个参数;字典到多个关键字参数。
3、unpack装饰器
[示例2] unpack dict
#coding:utf-8
import unittest
#从ddt模块导入装饰器ddt,file_data,unpack,data
from ddt import ddt,file_data,unpack,data
#测试取绝对值函数abs()
@ddt
class AbsTest(unittest.TestCase):
@data({"val":1,"res":1},
{"val":0,"res":0},
{"val":-1,"res":1})
@unpack
def test_abs(self,val,res):
self.assertEqual(abs(val),res)
if __name__ == "__main__":
unittest.main()
示例2运行结果:
[示例3] unpack list
#测试取绝对值函数abs()
@ddt
class AbsTest(unittest.TestCase):
# @data({"val":1,"res":1},
# {"val":0,"res":0},
# {"val":-1,"res":1})
@data([-1,1],[0,0],[1,1])
@unpack
def test_abs(self,val,res):
self.assertEqual(abs(val),res)
if __name__ == "__main__":
unittest.main()
示例3运行结果同示例2。
4、file_data装饰器
ddt支持从文件中加载数据,@file_data()装饰器会从json或yaml中加载数据。只有以“.yml” 和 “.yaml” 结尾的文件被加载为Yaml文件。所有其他格式文件都作为json文件加载,比如txt。修改示例3。
abs_data.json文件位于测试用例同级目录,内容如下:
{
"case1":{
"val":1,
"res":1
},
"case2":{
"val":-1,
"res":1
},
"case3":{
"val":0,
"res":0
}
}
[示例4] load json
在测试方法test_abs上设置@file_data装饰器:
#测试取绝对值函数abs()
@ddt
class AbsTest(unittest.TestCase):
# @data({"val":1,"res":1},
# {"val":0,"res":0},
# {"val":-1,"res":1})
@file_data("./abs_data.json")
def test_abs(self,val,res):
self.assertEqual(abs(val),res)
if __name__ == "__main__":
unittest.main()
示例4运行结果:
5、总结
使用数据驱动思想编写测试用例有以下优势:
- 测试代码和测试数据分开,比较灵活,易维护。
- 在测试代码相对健壮的情况下,新增用例只需新增测试数据即可,开发难度小。
- 避免编写大量相同的测试代码,代码复用率高。
劣势是对测试代码的质量要求相对较高,试想如果因为测试数据的变化而需要频繁改动测试方法,那也是一件很痛苦的事情哦。关于测试数据驱动测试,有的玩法是通过从Excel加载测试数据,这一定程度上来讲也是可行的,但是碰到复杂的业务场景和测试数据比较多的情况,非常容易翻车的哦。
(完)
点击这里返回本篇目录
Python3|ddt|unittest|浅议数据驱动测试的更多相关文章
- unittest+ddt_实现数据驱动测试(7)
我们设计测试用例时,会出现测试步骤一样,只是其中的测试数据有变化的情况,比如测试登录时的账号密码.这个时候,如果我们依然使用一条case一个方法的话,会出现大量的代码冗余,而且效率也会大大降低.此时, ...
- 如何快速掌握DDT数据驱动测试?
1.前言 (网盗概念^-^)相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离, 这样的测试脚本设计模式称为数据驱动.(网盗结束)当我们测试某个网站的登录功能时,我们往往会使用不同的用 ...
- Python Selenium 之数据驱动测试
数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...
- Python Selenium 之数据驱动测试的实现
数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...
- python - 数据驱动测试 - ddt
# -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_ddt.py @ide: PyCharm Communit ...
- 【python接口自动化】- DDT数据驱动测试
简单介绍 DDT(Date Driver Test),所谓数据驱动测试,简单来说就是由数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使用数据驱动测试的方法,可以在需要验证多组数据 ...
- 【python】以souhu邮箱为例学习DDT数据驱动测试
前言 DDT(Data-Driven Tests)是针对 unittest 单元测试框架设计的扩展库.允许使用不同的测试数据来运行一个测试用例,并将其展示为多个测试用例.通俗理解为相同的测试脚本使用不 ...
- Python+Selenium笔记(十二):数据驱动测试
(一) 前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二) ddt 使用ddt执行数据驱动测试,ddt库可以将测试 ...
- 好代码是管出来的——.Net Core集成测试与数据驱动测试
软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...
随机推荐
- 自己用 Netty 实现一个简单的 RPC
目录: 需求 设计 实现 创建 maven 项目,导入 Netty 4.1.16. 项目目录结构 设计接口 提供者相关实现 消费者相关实现 测试结果 总结 源码地址:github 地址 前言 众所周知 ...
- 对JavaScript事件机制的一点理解
JavaScript通过事件机制实现了异步操作,这种异步操作可以使CPU可以在IO任务的等待中被释放出来处理其他任务,等待IO结束再去处理这个任务.这个是一个基本的事件机制. 那么是不是说事件从监听到 ...
- mysql-索引、关系、范式
索引 几乎所有的索引都是建立在字段之上 索引:系统根据某种算法,将已有的数据(未来可能新增的数据也算),单独建立一个文件,这个文件能够快速的匹配数据,并且能够快速的找到对应的表中的记录 索引意义 能够 ...
- c# 语法要点速览
C# 变量类型 sbyte byte short ushort int uint long ulong float double decimal char bool string switch 默认不 ...
- java基础- Collection和map
使用构造方法时,需要保留一个无参的构造方法 静态方法可以直接通过类名来访问,而不用创建对象. -- Java代码的执行顺序: 静态变量初始化→静态代码块→初始化静态方法→初始化实例变量→代码块→构造方 ...
- github page 配置hexo 博客 的常见错误
缘起 最近看到好多的公众号作者推荐大家搭建自己的博客,自己手痒也搭建了一个个人博客lumang,具体过程就是一开始上网搜索一番教程,按照教程开始搭建,由于是windows的环境,同时教程也有很多的老旧 ...
- 高质量的内容是SEO的关键
内容是最有效的SEO策略,但也是最难执行的 正确的目录对SEO(搜索引擎优化:search engine optimization)关乎重大.根据Ascend2在2014年4月对全球营销专业人士做的调 ...
- PAT1007:Maximum Subsequence Sum
1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- SIMATIC_STEP_V5.6使用报错
SIMATIC_STEP_V5.6是西门子出来的一款能够在Windows 10上运行的step 7软件. 正常的安装步骤我们可以在百度上面进行一些查找,在这里我将我遇到的一个问题发出来. 在Windo ...
- 项目开发中如何规范自己的CSS
1.CSS规范 - 分类方法 CSS文件的分类和引用顺序 通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类. 我们按照CSS的性质和用途,将CSS文件分成“公共型样 ...