接口自动化笔记01:ddt模块调用数据

简介

DDT模块主要用于遍历测试数据,在一个测试用例方法中,可以循环遍历入参的所有数据组情况。

  • 适用情况:当测试一个接口,不同的测试入参数据组合时,比如登录接口,需要验证不同的情况(账号错误、密码错误、验证码错误等)

为什么使用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()

如何使用

  1. 添加ddt 模块(pycharm-setting-project Interpreter,点击+号搜索ddt添加库)
  2. 代码中 import ddt
  3. 需要在运行测试用例的class上加入装饰器:@ddt.ddt
  4. 需要在运行测试用例的def上,加入装饰器:@ddt.data(*sampleData)来引用测试数据:sampleData
  5. 需要在运行测试用例的def中,传入入参数据samData
  • 注:(sampleData为测试数据集,samData为ddt自动分割的测试数据组,比如sampleData = [1,2,3] samData就为单个元素1,2,3;用例会执行三次,每次传入不同的samData数据)

sample代码

# 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

你可能感兴趣的:(接口自动化测试)