在进行单元测试的时候我们可能会遇到这种情况:某条用例我想执行很多遍,但是每次执行传入的参数不同。没错,我们在测试登录功能的时候就很可能出现这种需求。这就引入了我们今天的ddt(数据驱动)。
ddt是python的扩展库,我们可以使用pip来进行安装,命令如下:
pip install ddt
话不多说,先来看代码:
#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.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()
我们通过在代码中的定义数据列表的方式来实现数据驱动,以后维护起来不方便。我们当然可以通过在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(感谢作者)