在作测试的时候,有些地方不管是接口仍是UI只是参数数据的输入不同,操做过程是同样的。重复去写操做过程会增长代码量,咱们能够经过参数化的方式解决这个问题,也叫作数据驱动,咱们经过python作参数化的方法有不少种,今天咱们介绍一种简单的方法DDThtml
官方文档:https://ddt.readthedocs.io/en/latest/example.htmlpython
ddt属于python的第3方库,须要经过pip进行安装json
pip install ddt
ddt中经常使用的类的装饰器一个data(能够直接传数据)一个find_data(能够经过json或者yaml传输)解压分析数据unpack,剩下的小伙伴们能够本身看看源码进行学习哈api
data装饰器源码app
def data(*values): """ 方法装饰器来添加到您的测试方法中。 应该添加到' ' unittest.TestCase ' '实例的方法中 """ global index_len index_len = len(str(len(values))) return idata(values)
find_data装饰器源码post
def file_data(value): """ 方法装饰器来添加到您的测试方法中。 应该添加到' ' unittest.TestCase ' '实例的方法中。 ' ' value ' '应该是一个相对于文件目录的路径 包含修饰过的' ' unittest.TestCase ' '。该文件 应该包含JSON编码的数据,能够是列表,也能够是 字典 对于列表,列表中的每一个值都对应一个值 测试用例,该值将链接到测试方法 的名字。 """ def wrapper(func): setattr(func, FILE_ATTR, value) return func return wrapper
unpack源码学习
def unpack(func): """ 方法装饰器来添加解压功能。 """ setattr(func, UNPACK_ATTR, True) return func
这里咱们经过一个来更加的了解下DDT数据驱动的内容测试
经过查询音乐接口了解ddt使用方法编码
一、首先导入ddt模块,在类在修饰ddt.ddturl
二、编写ddt用例格式
三、使用的用例修饰ddt.data
四、查看导入数据是否正确
这里的参数数据通常字典形式存放,一组数据为一组字典
# coding:utf-8 import unittest import requests import ddt # 参数数据 testddt = [{'name':'断桥残雪'}, {'name':'像鱼'}] @ddt.ddt class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b @ddt.data(*testddt) def test01(self,data): print('当前测试数据:%s'%data) result = self.select(data['name']) self.assertEqual(result,data['name']) if __name__ == '__main__': unittest.main()
经过执行后,咱们能够发现用例所有都是经过的,执行的数据也是咱们ddt中存放的数据
若是数据在字典内容展现,可是下面没有具体的提取数据,咱们能够经过这个unpack来解压数据
# coding:utf-8 import unittest import requests import ddt # 参数数据 testddt = [{'name':'断桥残雪'},{'name':'像鱼'}] @ddt.ddt class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b @ddt.data(*testddt) @ddt.unpack def test01(self,name): print('当前测试数据:%s'%name) result = self.select(name) self.assertEqual(result,name) if __name__ == '__main__': unittest.main()
file_data能够经过读取yaml和json的数据来进行实现,咱们能够动手试试下,先配置yaml把想要的数据类型都存放在里面
读取方法,在用例上方添加装饰器后面带上yaml的文件名,经过请求后发现已经请求成功了
# coding:utf-8 import unittest import requests import ddt @ddt.ddt class Music(unittest.TestCase): def select(self,name): url = 'https://api.apiopen.top/searchMusic' data = { "name":name } r = requests.post(url,data=data) b = r.json()['result'][0]['title'] return b @ddt.file_data('name.yaml') def test01(self,name): print('当前测试数据:%s'%name) result = self.select(name) self.assertEqual(result,name) if __name__ == '__main__': unittest.main() 当前测试数据:断桥残雪 当前测试数据:像鱼 .. ---------------------------------------------------------------------- Ran 2 tests in 0.244s OK
这里还有file_data也能够请求json数据,这里就不作写,你们能够本身动手写一写