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|浅议数据驱动测试的更多相关文章

  1. unittest+ddt_实现数据驱动测试(7)

    我们设计测试用例时,会出现测试步骤一样,只是其中的测试数据有变化的情况,比如测试登录时的账号密码.这个时候,如果我们依然使用一条case一个方法的话,会出现大量的代码冗余,而且效率也会大大降低.此时, ...

  2. 如何快速掌握DDT数据驱动测试?

    1.前言 (网盗概念^-^)相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离, 这样的测试脚本设计模式称为数据驱动.(网盗结束)当我们测试某个网站的登录功能时,我们往往会使用不同的用 ...

  3. Python Selenium 之数据驱动测试

    数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...

  4. Python Selenium 之数据驱动测试的实现

    数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据.可以将测 ...

  5. python - 数据驱动测试 - ddt

    # -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_ddt.py @ide: PyCharm Communit ...

  6. 【python接口自动化】- DDT数据驱动测试

    简单介绍 ​ DDT(Date Driver Test),所谓数据驱动测试,简单来说就是由数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使用数据驱动测试的方法,可以在需要验证多组数据 ...

  7. 【python】以souhu邮箱为例学习DDT数据驱动测试

    前言 DDT(Data-Driven Tests)是针对 unittest 单元测试框架设计的扩展库.允许使用不同的测试数据来运行一个测试用例,并将其展示为多个测试用例.通俗理解为相同的测试脚本使用不 ...

  8. Python+Selenium笔记(十二):数据驱动测试

    (一)   前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二)   ddt 使用ddt执行数据驱动测试,ddt库可以将测试 ...

  9. 好代码是管出来的——.Net Core集成测试与数据驱动测试

    软件的单元测试关注是的软件最小可执行单元是否能够正常执行,但是软件是由一个个最小执行单元组成的集合体,单元与单元之间存在着种种依赖或联系,所以在软件开发时仅仅确保最小单元的正确往往是不够的,为了保证软 ...

随机推荐

  1. YOLO_Online 将深度学习最火的目标检测做成在线服务实战经验分享

    YOLO_Online 将深度学习最火的目标检测做成在线服务 第一次接触 YOLO 这个目标检测项目的时候,我就在想,怎么样能够封装一下让普通人也能够体验深度学习最火的目标检测项目,不需要关注技术细节 ...

  2. 程序员DD 《Spring boot教程系列》补充

    最近在跟着程序员DD的Spring boot教程系列学习Spring boot,由于年代原因,Spring boot已经发生了一些变化,所以在这里进行一些补充. 补充的知识大多来自评论区,百度,Sta ...

  3. python 面向对象终极进阶之开发流程

    好了,你现在会了面向对象的各种语法了,  但是你会发现很多同学都是学会了面向对象的语法,却依然写不出面向对象的程序,原因是什么呢?原因就是因为你还没掌握一门面向对象设计利器, 此刻有经验的人可能会想到 ...

  4. AndroidStudio 快捷键 Ctrl+Q查询过慢的问题

    Ctrl+Q快捷键的作用是快速查找文档注释   但是有时候会一直fetching   需要等很长时间这时候   打开本地文件 C:\Users\Adminastration\.AndroidStudi ...

  5. 谈谈书本《c#物联网程序设计基础》中的技术瑕疵,如果你将要读本书,请进来看看!

    今天去书店看到一本名为<c#物联网程序设计基础>的书,对物联网感兴趣的我抓起来就看,书中的项目都是上位机开发项目,较简单,如果物联网开发只是这样,看起来我做物联网开发也是绰绰有余.这边书我 ...

  6. mysql学习 第二章 数据库的基本操作

    3.1   创建数据库 MySQL安装好之后,首先需要创建数据库,这是使用MySQL各种功能的前提.本章将详细介绍数据的基本操作,主要内容包括:创建数据库.删除数据库.不同类型的数据存储引擎和存储引擎 ...

  7. 常用的TCP选项

    MSS选项:通知最大可接收量.发送SYN的TCP一端使用本选项通告对端它的最大分节大小(maximum segment size)即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数据量.发送 ...

  8. python抓取数据构建词云

    1.词云图 词云图,也叫文字云,是对文本中出现频率较高的"关键词"予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者只要一眼扫过文本就可领略文本的主旨. 先看几个词 ...

  9. 好代码是管出来的——浅谈.Net Core的代码管理方法与落地(更新中...)

    软件开发的目的是在规定成本和时间前提下,开发出具有适用性.有效性.可修改性.可靠性.可理解性.可维护性.可重用性.可移植性.可追踪性.可互操作性和满足用户需求的软件产品. 而对于整个开发过程来说,开发 ...

  10. mime.go

    package manager import (     "mime"     "path" ) //初始化数据 func init() {     if mi ...