1、引言
在写接口自动化框架时,有时候我们执行的脚本相同,就是传入的参数不同而已,这种情况下没必要挨个挨个写用例脚本,使用ddt数据驱动就能完美解决这个问题,所以我在接口自动化框架中就引用了ddt,不过在使用的过程中也遇到一些坑,写这个博文的目的有两点,一是记录自己踩过的坑,以免在工作中再次遇到忘记怎么解决,二是总结出来提供给大家查阅。
2、问题总结
2.1、ddt中data问题:
我的ddt代码如下:
import unittest from Common.ExcelTools.ExcelddtTools import ExcelDDTTools from Common.CommonTools.LogTools import LogTools from Common.CommonTools.DataBaseTools import DataBaseTools from ddt import ddt,data,unpack '''用户注册类api接口异常测试''' @ddt class API_ZC_ABNL(unittest.TestCase): #通过需要执行的用例sheet获取ddt数据 ddt_tools=ExcelDDTTools() data_list=ddt_tools.get_ddt_datalist('ZC') '''用户注册类api接口异常测试''' @classmethod def setUpClass(self): self.ddttools=ExcelDDTTools() self.db=DataBaseTools() self.log=LogTools() self.log.info('>>>>>>>>>>>>>>>>>>>>>[ZC_api_abnl_start]<<<<<<<<<<<<<<<<<<<<') @classmethod def tearDownClass(self): self.db.cur_close() # 关闭游标 self.log.info('>>>>>>>>>>>>>>>>>>>>>[ZC_api_abnl_end]<<<<<<<<<<<<<<<<<<<<<<') @data(*data_list) def test_zc_abnl(self,data): '''用户注册类api接口异常用例''' self.ddttools.send_request(data) if __name__=="__main__": unittest.main()
在这里我遇到的问题是我的data_list的格式为list中嵌套了多个字典,类似于[{....},{....},{....},{....}],当我把data_list直接放入ddt的data中时,执行用例,data其实获取到的是全部字典作为参数,类似于{....},{....},{....},{....},这样与自己当时所想要的结果不一致,我的想法是将列表中的每个字典作为参数进行用例执行,那该怎么办呢?
正如上面代码你们看到的,在data_list前面加上*就解决了,原理是*data_list是将data_list里面的每个值都作为一个参数传入到data中,这样就能实现了多个参数在同一条代码中执行了!
用法介绍:
def add(a,b): return(a+b) numlist=[4,3] #numlist中的4,3作为参数传入 print(add(*numlist)) #equals to print add(4, 3) numdict={'a':4,'b':3} #numdict中的4,3作为参数传入 print(add(**numdict)) #equals to print add(4, 3)
tips:ddt后续问题会持续更新,欢迎查阅