DDT模块主要用于遍历测试数据,在一个测试用例方法中,可以循环遍历入参的所有数据组情况。
起因:
在写自动化接口测试的过程中,我沿用了之前使用过的的unittest框架,例如在一个case中写登录的方法,我希望写一个登录的方法,我传参进入方法,然后进行登录的接口发送。
例如:
import unittest
login = {"url": "http://test.com", "method": "post"}
class Demo(unittest.TestCase):
def test_login(self, login_message):
"""登录的接口方法(简化)"""
print("登录请求 %s" % login_message)
if __name__ == '__main__':
# 运行这个登录方法
Demo().test_login(login)
但是有一个问题,我想传好几组参数:登录正常、账号异常、密码错误、密码为空…好几种情况,这个时候我想要验证的话,该怎么办呢。
第一种想法:
传入一个列表,在方法里进行循环:
import unittest
login_list = [{"url": "http://test.com", "method": "post"}]
class Demo(unittest.TestCase):
def test_login(self, login_message):
"""登录的接口方法(简化)"""
for i in login_message:
print("登录请求 %s" % i)
if __name__ == '__main__':
Demo().test_login(login_list)
第二种想法:
我在调用登录方法的时候,根据入参的个数,来多次调用方法:
import unittest
login_list = [{"url": "http://test.com", "method": "post"}]
class Demo(unittest.TestCase):
def test_login(self, login_message):
"""登录的接口方法(简化)"""
print("登录请求 %s" % login_message)
if __name__ == '__main__':
# 运行这个登录方法
for i in login_list:
Demo().test_login(i)
但是我觉得这两种方法都不太好,于是我找到了ddt这个第三方模块,通过这个模块可以比较优雅的解决这个问题。
通过ddt这个模块,可以将我们准备的数据作为入参传递到方法中,如果是可以迭代的类型,例如list列表这样可以迭代的数据类型,那就可以自动循环入参。
如果你把下面的代码中,login_list改回字典类型的单个入参,你会发现仍然可以正常运行,也就是说ddt是能判断我们入参的数据类型的。
加入ddt后的代码
import unittest
import ddt
login_list = [{"url": "http://test.com", "method": "post"},
{"url": "http://csdn.com", "method": "post"}]
@ddt.ddt
class Demo(unittest.TestCase):
@ddt.data(*login_list)
def test_login(self, login_message):
"""登录的接口方法(简化)"""
print("登录请求 %s" % login_message)
if __name__ == '__main__':
# 运行这个登录方法
unittest.main()
# coding:utf-8
import ddt
import unittest
sampleData = [1,2,3]
@ddt.ddt
class ddtSample(unittest.TestCase):
def setUp(self):
pass
@ddt.data(*sampleData)
def test_ddtSample(self, samData):
print(data)
def tearDown(self):
pass
if __name__ == "__main__":
unittest.main()
# coding:utf-8
import ddt
import unittest
# 测试数据
test_data1 = [{"username": "张三", "pwd": "zhangsan"},
{"username": "李四", "pwd": "lisi"},
{"username": "王五", "pwd": "wangwu"},
]
test_data2 = [{"username": "悟空", "pwd": "wukong"},
{"username": "悟能", "pwd": "woneng"},
{"username": "悟净", "pwd": "wujing"},
]
@ddt.ddt
class Test(unittest.TestCase):
def setUp(self):
print("Start!")
def tearDown(self):
print("end!")
@ddt.data(*test_data1)
def test_ddt1(self, data):
print(data)
@ddt.data(*test_data2)
def test_ddt2(self, data):
print(data)
if __name__ == "__main__":
unittest.main()
{'pwd': 'zhangsan', 'username': '张三'}
end!
----------------------------------------------------------------------
Start!
Ran 6 tests in 0.001s
{'pwd': 'lisi', 'username': '李四'}
end!
OK
Start!
{'pwd': 'wangwu', 'username': '王五'}
end!
Start!
{'pwd': 'wukong', 'username': '悟空'}
end!
Start!
{'pwd': 'woneng', 'username': '悟能'}
end!
Start!
{'pwd': 'wujing', 'username': '悟净'}
end!
Process finished with exit code 0
当初学习ddt时的参考资料地址:
http://www.cnblogs.com/lingzeng86/p/6790827.html
http://www.imooc.com/article/14861
http://blog.csdn.net/u013118036/article/details/45558951