Unittest篇之数据驱动ddt

引入

在进行单元测试的时候我们可能会遇到这种情况:某条用例我想执行很多遍,但是每次执行传入的参数不同。没错,我们在测试登录功能的时候就很可能出现这种需求。这就引入了我们今天的ddt(数据驱动)。

ddt安装

ddt是python的扩展库,我们可以使用pip来进行安装,命令如下:

pip install ddt

ddt使用

@ddt.ddt 和@ddt.data()

话不多说,先来看代码:

#coding=utf-8

import unittest
import ddt

messages=("1","2","3")
@ddt.ddt
class TestDDT(unittest.TestCase):

    def setUp(self):
        print("start")
    def tearDown(self):
        print("end")
    @ddt.data(*messages)
    def test_print(self,message1):
        print(message1)

if __name__=="__main__":
    unittest.main()

在上面这段代码中, 我们先是导入了ddt包;接着定义了一组数据,也就是我们要传的参数元组;然后我们在测试类上加了@ddt.ddt的这样一个标签;然后我们正常写我们的测试函数,注意在测试函数上我们又加了@ddt.data()这样一个标签,括号里面写的是我们刚刚提到的参数元组(别忘了前面的*号);最后是我们的运行函数。具体运行情况如下图:就这样我们通过写一个测试用例,传入不同的参数进行了多次执行。
运行结果图
当然,你也可以不定义参数元组或列表,直接传入,执行效果是一样的:

#coding=utf-8

import unittest
import ddt

@ddt.ddt
class TestDDT(unittest.TestCase):

    def setUp(self):
        print("start")
    def tearDown(self):
        print("end")
    @ddt.data("1","2","3")
    def test_print(self,message1):
        print(message1)

if __name__=="__main__":
    unittest.main()
@ddt.unpack

当我们传入的参数不只是一个,而是两个甚至多个时候,我们需要用到另外一个标签,我们在@ddt.data()标签下又加了@ddt.unpack这个标签,如果不加这个标签执行将会报错,如下代码:

#coding=utf-8

import unittest
import ddt

messages=[("you","你"),("me","我"),("he","他")]
@ddt.ddt
class TestDDT(unittest.TestCase):

    def setUp(self):
        print("start")
    def tearDown(self):
        print("end")
    @ddt.data(*messages)
    @ddt.unpack
    def test_print(self,message1,message2,):
        print(message1,"------",message2)

if __name__=="__main__":
    unittest.main()

运行结果如图:
运行结果图

@ddt.file()

我们通过在代码中的定义数据列表的方式来实现数据驱动,以后维护起来不方便。我们当然可以通过在Excel表格中存储数据然后解析生成列表的方式来数据分离。这里我们介绍另一种方式,就是@ddt.file()标签。这个方法中我们可以处理yaml类型的文件(文件后缀名是".yml"或".yaml"的时候),也可以处理json文件(文件后缀名不是".yml"或".yaml"的时候)。
JSON文件:我们先建立一个JSON格式的文件:

[
  "你",
  "我",
  "他"
]

我们的测试代码如下:

#coding=utf-8

import unittest
import ddt


@ddt.ddt
class TestDDT(unittest.TestCase):

    def setUp(self):
        print("start")
    def tearDown(self):
        print("end")

    @ddt.file_data("testJson.json")
    def test_print(self,message1):
        print(message1)

if __name__=="__main__":
    unittest.main()

yaml文件:我们先建立一个yaml文件,关于".yaml"文件的格式可以参考yaml编写参考(感谢该作者),我们在使用yaml文件时需要安装PyYAML扩展模块,使用pip命令安装即可。

-
  "你"
-
  "我"
-
  "他"

我们的测试代码如下:

#coding=utf-8

import unittest
import ddt


@ddt.ddt
class TestDDT(unittest.TestCase):

    def setUp(self):
        print("start")
    def tearDown(self):
        print("end")

    @ddt.file_data("testYaml.yaml")
    def test_print(self,message1):
        print(message1)

if __name__=="__main__":
    unittest.main()

两个方式的运行结果均如下图:
运行结果

参考:
https://www.cnblogs.com/yoyoketang/p/6706490.html(感谢作者)
https://www.cnblogs.com/chendai21/p/8675982.html(感谢作者)
https://www.cnblogs.com/miniren/p/7099187.html(感谢作者)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值