DDT框架结合单元测试

Wesley13
• 阅读 671

文章总览图

DDT框架结合单元测试

  • Excel读写测试数据

  • python配置文件的类封装

  • DDT框架原理以及使用

  • DDT框架结合单元测试

读取数据的方式

方法一:一次性读取所有的数据,对内存的要求高点。

方法二:需要用的时候读取所有的数据,就是磁盘读写要求高点。

磁盘(速度最低)----》 内存(速度中间)---》 CPU(速度最高)

如果磁盘数据量大,一次性读取到内存,再读取到CPU,这样快点。每次启动磁盘读到内存再到CPU,CPU会等待磁盘读到数据,造成CPU资源的浪费。

方式一,方式二都ok,以后肯定是方法一。

方法三:使用DDT进行参数化。

Excel处理

Excel去处理测试数据,得到测试结果。把数据存到Excel里面去,通过Python去操作Excel。 openpyxl只支持.xlsx这种格式。

先创建一个xh.xlsx文件。

DDT框架结合单元测试

#来自文件do_excel_1.pyfrom openpyxl import load_workbook#打开工作簿wb=load_workbook("xh.xlsx")sheet=wb['python']#错误演示1:res=sheet.cell(do,do)# 只定位到单元格,并未取值。#返回:<Cell 'python'.A1># res=sheet.cell(do,do).value# print(res)test_data=[]for i in range(1,sheet.max_row+1):#取1-5之间的值,do,2,3,4    sub_data={}    method=sheet.cell(i,1).value    sub_data['method']=method    url=sheet.cell(i,2).value    sub_data['url']=url    data=sheet.cell(i,3).value    sub_data['data']=data    expected=sheet.cell(i,4).value    sub_data['expected']=expected    test_data.append(sub_data)print(test_data)

运行结果如下:

DDT框架结合单元测试

#来自文件class_excel.pyfrom openpyxl import load_workbook#do.打开Excelwb=load_workbook("xh.xlsx")#2.定位表单sheet=wb['python']#传表单名,返回一个表单对象。#3.定位单元格。根据行列值定位res=sheet.cell(1,1).value#拿单元格里面的值用.valueprint("最大行:{}".format(sheet.max_row))#求表单的最大行,有空行也算。print("最大列:{}".format(sheet.max_column))#求表单的最大列,有空列也算# print("拿到的结果是:",res)#数据从Excel里面拿出来是什么类型?#数字还是数字,其它都是字符串。print("url:{},类型是{}".format(sheet.cell(1,1).value,type(sheet.cell(1,1).value)))print("date:{},类型是{}".format(sheet.cell(1,2).value,type(sheet.cell(1,2).value)))print("code:{},类型是{}".format(sheet.cell(1,3).value,type(sheet.cell(1,3).value)))print("float:{},类型是{}".format(sheet.cell(1,4).value,type(sheet.cell(1,4).value)))print("float:{},类型是{}".format(sheet.cell(1,5).value,type(sheet.cell(1,5).value)))# 拓展:#eval()只限于字符串的布尔值、字符串的元组、字符串的列表,字符串的数字转换成原本的数据类型。# s='True'# print(eval(s),type(eval(s)))# 输出结果:# True <class 'bool'># s='{"age":18}'# print(s,type(s))# 输出结果如下:# {"age":18} <class 'str'># print(eval(s),type(eval(s)))# 输出结果如下:# {'age': 18} <class 'dict'>

输出结果如下:

DDT框架结合单元测试

三种方法读取数据

#来自文件http_request.pyimport requestsclass HttpRequest:    '''利用request封装get请求和post请求'''    def http_request(self,url,data,method,cookie=None):        '''url:请求的地址 http://xxx:port               param:传递的参数  非必填参数  字典的格式传递参数               method:请求方式支持get以及post  字符串形式的参数               cookie:请求的时候传递的cookie值'''        if method.lower()=='get':            res = requests.get(url, data, cookies=cookie)        else:            res=requests.post(url,data,cookies=cookie)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookie        return res#返回一个消息实体if  __name__ =='__main__':    url = 'http://v.juhe.cn/laohuangli/d'    data =  {"key": "abf91475fc19f66c2f1fe567edd75257", "date": '2014-09-09'}    res=HttpRequest().http_request(url,data,'post')    print("登录结果是:", res.json())#充值    recharge_url='http://v.juhe.cn/laohuangli/d'    recharge_data= {"key": "abf91475fc19f66c2f1fe567edd75257", "date": '2014-09-09'}    recharges_res=HttpRequest().http_request(recharge_url,recharge_data,'get',res.cookies)    print("充值结果是:",recharges_res.json())

#来自文件get_data.pyclass GetData:    Cookie=None#存储cookie,初始值为None    

方法一

一次性读取所有的数据。

先桌面创建一个1.xlsx文件,填写进需要的数据,保存后复制进do_Excel文件夹中或者在Python代码文件夹的磁盘路径下创建.xlsx文件。注意:不可在Python中直接新建.xlsx文件。

DDT框架结合单元测试

#来自文件do_excel_1.pyfrom openpyxl import load_workbook#打开工作簿class DoExcel:    def __init__(self,file_name,sheet_name):        self.file_name=file_name        self.sheet_name=sheet_name    def get_data(self):        wb=load_workbook(self.file_name)        sheet=wb[self.sheet_name]#错误点2:写成了字符串['self.sheet_name'],所以报错。        test_data=[]        for i in range(1,sheet.max_row+1):#取1-5之间的值,1,2,3,4            sub_data={}            sub_data['method']=sheet.cell(i,1).value            sub_data['url']=sheet.cell(i,2).value            sub_data['data']=sheet.cell(i,3).value            sub_data['expected']=sheet.cell(i,4).value            test_data.append(sub_data)        return test_data#返回获取到的数据if __name__ ==  '__main__':    print(DoExcel("1.xlsx", "python").get_data())

#来自文件test_http_1.pyimport unittestfrom do_Excel.http_request import HttpRequestfrom do_Excel.get_data import GetDataclass TestHttp(unittest.TestCase):    def setUp(self):        pass    # 数据给它参数化,通过初始化传参,实现参数化    def __init__(self,methodName,url,data,method,expected):#通过初始化函数来传参数        super(TestHttp,self).__init__(methodName)#父类的方法要保留,用的超继承。        self.url=url        self.data=data        self.method=method        self.expected=expected    def test_api(self):#接口用例            res=HttpRequest().http_request(self.url,self.data,self.method,getattr(GetData,'Cookie'))            if res.cookies:#如果cookie有的话,就更新COOKIE                  setattr(GetData,'Cookie',res.cookies)#反射            try:                self.assertEqual(self.expected,res.json()['reason'])            except AssertionError as e:                print("test_api's error is{}".format(e))                raise e            print(res.json())    def tearDown(self):        pass

#来自文件test_suite_1.pyimport unittestimport HTMLTestRunnerfrom do_Excel.test_http_1 import TestHttp#类名from do_Excel.do_excel_1 import  DoExceltest_data=DoExcel("1.xlsx", "python").get_data()suite=unittest.TestSuite()#遍历数据for item in  test_data:#创建实例    suite.addTest(TestHttp("test_api",item['url'],eval(item['data']),item['method'],str(item['expected'])))#实例的方式去加载用例url,data,method,expected#执行with open("test_summer.html",'wb')as file:    runner=HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2,title="单元测试",description=None,tester="清菡")    runner.run(suite)

文件夹do_Excel下已创建文件request.py,文件get_data.py,文件do_excel_1.py,文件test_http_1.py和文件test_suite_1.py,执行文件test_suite_1.py

输出结果如下:

DDT框架结合单元测试

方法二

需要用的时候读取所有的数据。

数据给它参数化,通过初始化传参,实现参数化。根据传入的坐标来获取值。实例的方式去加载用例url,data,method,expected。

#方法二

#来自文件do_excel_2.pyfrom openpyxl import load_workbook#打开工作簿class DoExcel:    def __init__(self,file_name,sheet_name):        self.file_name=file_name        self.sheet_name=sheet_name        self.sheet_obj=load_workbook(self.file_name)[self.sheet_name]#打开了一个工作簿,再去拿到表单名,        #在实例化里面拿到1个表单对象,把表单对象存在里面。        self.max_row=self.sheet_obj.max_row    def get_data(self,i,j):        '''根据传入的坐标来获取值'''        return self.sheet_obj.cell(i,j).valueif __name__ ==  '__main__':    res=(DoExcel("xh.xlsx", "python").get_data(1,1))    print(res)    

#来自文件test_http_2.pyimport unittestfrom do_Excel.http_request import HttpRequestfrom do_Excel.get_data import GetDataclass TestHttp(unittest.TestCase):   def setUp(self):       print("开始测试啦")   # 数据给它参数化,通过初始化传参,实现参数化   def __init__(self,methodName,method,url,data,expected):#通过初始化函数来传参数       super(TestHttp,self).__init__(methodName)#父类的方法要保留,用的超继承。       self.url=url       self.data=data       self.method=method       self.expected=expected   def test_api(self):#接口用例           res=HttpRequest().http_request(self.url,self.data,self.method,getattr(GetData,'Cookie'))           if res.cookies:#如果cookie有的话,就更新COOKIE                 setattr(GetData,'Cookie',res.cookies)#反射           try:               self.assertEqual(self.expected,res.json()['reason'])           except AssertionError as e:               print("test_api's error is{}".format(e))               raise e           print(res.json())   def tearDown(self):       pass

#来自文件test_suite_2.py#方法二import unittestimport HTMLTestRunnerfrom do_Excel.test_http_2 import TestHttp#类名from do_Excel.do_excel_2 import  DoExceltest_data=DoExcel("1.xlsx", "python")t=DoExcel('1.xlsx','python')suite=unittest.TestSuite()for i in range(1,t.max_row+1):    suite.addTest(TestHttp("test_api",t.get_data(i,1),t.get_data(i,2),eval(t.get_data(i,3)),str(t.get_data(i,4))))    #实例的方式去加载用例url,data,method,expected#执行with open("test_summer.html",'wb')as file:    runner=HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2,title="单元测试",description=None,tester="清菡")    runner.run(suite)

文件夹do_Excel下已创建文件request.py,get_data.py,文件do_excel_2.py,文件test_http_2.py和文件test_suite_2.py,执行文件test_suite_2.py

输出结果如下:

DDT框架结合单元测试

方法三

根据嵌套循环读取数据。使用DDT进行参数化。

创建文件xh.xlsx文件:

DDT框架结合单元测试

#来自文件do_excel_3.py#方法3:仅供参考,日后可以拿来优化。from openpyxl import load_workbook#打开工作簿class DoExcel:    def __init__(self,file_name,sheet_name):        self.file_name=file_name        self.sheet_name=sheet_name    def get_header(self):        '''获取第一行的标题行'''        wb = load_workbook(self.file_name)        sheet = wb[self.sheet_name]        header=[]#存储我们的标题行        for j in range(1,sheet.max_column+1):            header.append(sheet.cell(1,j).value)        return header    def get_data(self):        '''根据嵌套循环读取数据'''        wb=load_workbook(self.file_name)        sheet=wb[self.sheet_name]        header=self.get_header()#拿到header,是一个列表。索引是从0开始的。        print("header:",header)        test_data=[]        for i in range(2,sheet.max_row+1):#取1-5之间的值,1,2,3,4            sub_data={}            for j in range(1,sheet.max_column+1):#1 2 3 4 5 6 7                sub_data[header[j-1]]=sheet.cell(i,j).value            test_data.append(sub_data)        return test_data#返回获取到的数据if __name__ ==  '__main__':    print(DoExcel("xh.xlsx", "python").get_data())

DDT

DDT是一个处理数据的模型。

安装ddt:打开cmd输入pip install ddt

pip install openpyxl

ddt+unittest来进行数据的处理的第三方库。有了它,不需要做超继承了,它会自动的把数据进行拆分。

#来自文件test_http_canshuhua.py#参数化,实现用例的可配置。import unittestfrom ddt import ddt,datafrom do_Excel.http_request import HttpRequestfrom do_Excel.get_data import GetDatafrom do_Excel.do_excel_canshuhua import DoExceltest_data=DoExcel('xh.xlsx','python').get_data([1,3])@ddtclass TestHttp(unittest.TestCase):    def setUp(self):        print("开始测试啦")    @data(*test_data)    def test_api(self,item):#接口用例            res=HttpRequest().http_request(item['url'],eval(item['data']),item['method'],getattr(GetData,'Cookie'))            if res.cookies:#如果cookie有的话,就更新COOKIE                  setattr(GetData,'Cookie',res.cookies)#反射            try:                self.assertEqual(str(item['expected']),res.json()['reason'])            except AssertionError as e:                print("test_api's error is{}".format(e))                raise e            print(res.json())    def tearDown(self):        pass

文件夹do_Excel下已创建文件request.py,文件get_data.py,文件do_excel_3.py,文件test_http_canshuhua.py,执行文件test_http_canshuhua.py

输出结果如下:

DDT框架结合单元测试

# 来自文件do_excel_4.pyfrom openpyxl import load_workbook#打开工作簿class DoExcel:    def __init__(self,file_name,sheet_name):        self.file_name=file_name        self.sheet_name=sheet_name    def get_data(self):        wb=load_workbook(self.file_name)        sheet=wb[self.sheet_name]#错误点2:写成了字符串['self.sheet_name'],所以报错。        test_data=[]        for i in range(2,sheet.max_row+1):            sub_data={}            sub_data['method']=sheet.cell(i,4).value            sub_data['url']=sheet.cell(i,5).value            sub_data['data']=sheet.cell(i,6).value            sub_data['expected']=sheet.cell(i,7).value            test_data.append(sub_data)        return test_data#返回获取到的数据if __name__ ==  '__main__':    print(DoExcel("xh.xlsx", "python").get_data())

#来自文件test_http_4.pyimport unittestfrom ddt import ddt,datafrom do_Excel.http_request import HttpRequestfrom do_Excel.get_data import GetDatafrom do_Excel.do_excel_4 import DoExceltest_data=DoExcel("xh.xlsx", "python").get_data()@ddtclass TestHttp(unittest.TestCase):    def setUp(self):        print("开始测试啦")    @data(*test_data)    def test_api(self,item):#接口用例            res=HttpRequest().http_request(item['url'],eval(item['data']),item['method'],getattr(GetData,'Cookie'))            if res.cookies:#如果cookie有的话,就更新COOKIE                  setattr(GetData,'Cookie',res.cookies)#反射            try:                self.assertEqual(str(item['expected']),res.json()['reason'])            except AssertionError as e:                print("test_api's error is{}".format(e))                raise e            print(res.json())    def tearDown(self):        pass

#来自文件test_suite_4.pyimport unittestimport HTMLTestRunnerfrom do_Excel.test_http_4 import TestHttp#类名from do_Excel.do_excel_4 import  DoExcel#DDT loaderloader=unittest.TestLoader()suite=unittest.TestSuite()suite.addTest(loader.loadTestsFromTestCase(TestHttp))#执行with open("test_summer.html",'wb')as file:    runner=HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2,title="单元测试",description=None,tester="清菡")    runner.run(suite)

文件夹do_Excel下已创建文件request.py,文件get_data.py,文件do_excel_4.py,文件test_http_4.py和文件test_suite_4,执行文件test_suite_4.py

输出结果如下:

DDT框架结合单元测试

脱外套

def print_msg(*args):    print(args)t=[1,4]#输出结果:[1, 4]# print(t)#脱外套print(*t)#输出结果:1 4

用unpack

ddt+unittest来进行数据的处理的第三方库。有了它,不需要做超继承了,它会自动的把数据进行拆分。

装饰器:会在你的函数运行之前运行,不会改变你代码的结构。例如@staticMethod就是装饰器。

@ddt装饰测试类。

@data(*test_data)装饰测试方法,拿到几个数据就执行几条用例。

@unpack拿到数据根据逗号进行拆分,如果unpack后的参数少于5个,推荐用unpack。

#来自文件class_ddt_unpack.pyimport unittestfrom ddt import ddt,data,unpacktest_data=[[1,3],[4,5,8]]#--->[do,3],[4,5,7]#--->[do,3]---->do 3要用2个参数来接收                                             #--->[4,5,7]--->4 5 7要用3个参数来接收@ddt#装饰测试类class TestMath(unittest.TestCase):#测试用例    @data(*test_data)#装饰测试方法,拿到几个数据就执行几条用例。    @unpack  # 拿到数据根据逗号进行拆分,如果unpack后的参数少于5个,推荐用unpack。    # 要注意参数不对等的情况,提供对应个数的参数来接收变量。    def test_add(self,a=None,b=None,c=None):#参数要一一对应        print("a",a)        print("b",b)        print('c',c)        '''        输出结果如下:        a do        b 3        c None        a 4        b 5        c 8        '''    # def test_add(self):        # a=10        # b=20        # print(a+b)#@data(test_data)不加*,是一条用例,执行1次。输出结果:item [do, 3]。加了*,@data(*test_data),#就脱1层外套变成两个数据,运行两次,两条用例。#输出结果:item do#         item 3#鼠标要放在最后面空白处进行运行。

@data(test_data)不加*,是一条用例,执行1次。输出结果:item [do, 3]。加了*,@data(*test_data),就脱1层外套变成两个数据,运行两次,两条用例。

直接运行文件class_ddt_unpack.py

输出结果如下:

DDT框架结合单元测试

不用unpack

#来自文件class_ddt_no_unpack.pyimport unittestfrom ddt import ddt,data,unpacktest_data=[[1,3],[4,5,8,9,10,11,12,13,14,15,16,17,18,19]]@ddt#装饰测试类class TestMath(unittest.TestCase):#测试用例    @data(*test_data)#装饰测试方法,拿到几个数据就执行几条用例。    def test_add(self,a):        print("a",a[1])

直接运行文件class_ddt_unpack.py

输出结果如下:

DDT框架结合单元测试

列表嵌套字典,对字典进行unpack

#来自文件liebiaoqiantaozidian_3.py#列表嵌套字典import unittestfrom ddt import ddt,data,unpack#列表里面嵌套了一个字典。test_data=[{"no":1,"name":"稳当"},{"no":2,"name":"小黄"}]@ddt#装饰测试类class TestMath(unittest.TestCase):#测试用例    @unpack    @data(*test_data)#装饰测试方法,拿到几个数据就执行几条用例。#如果要对字典进行unpack的话,参数名与你的字典key对应    def test_add(self,no,name):        print("no",no)        print("name", name)#直接run就行

直接运行文件liebiaoqiantaozidian_3.py

输出结果如下:

DDT框架结合单元测试

配置文件

实现用例的可配置:改一个参数就可以执行指定的用例。

properties config  ini   log4j 以这些结尾的都是不同的配置文件,里面有不同的参数。你改一下,代码就会以不同的方式执行。

数据库的文件就会写在这样结尾的配置文件中,万一我的项目变了,不需要去改代码,改配置文件就行了。

Python里面有个configparser模块,可以去读取配置文件里的信息。

配置文件中,不同的区域,表示要记不同的数据。片段只能用中括号[PYTHON11]

配置文件里的值分为3个区域,section,option,value组成,第一个section,叫做片段。配置文件的有些值需要分开存储的,不能放在一个地方混淆了。

同1类数据存储在同1类片段里面,片段名要大写,必须中括号括起来。option是选项,等号左侧那一栏都是option。等号右侧那一栏都是value。

option value相当于字典里的key:value一样。

configparser模块里面的ConfigParser实现用例的可配置。

单个片段

先在python里创建配置文件case.config

DDT框架结合单元测试

import configparsercf=configparser.ConfigParser()cf.read('case.config',encoding='utf-8')#读取配置文件的数据#第一种读值方式:res_1=cf.get('QINGHAN','age')#get获取到数据。print(res_1)#第二种读值方式:res_2=cf['MODE']['mode']print(res_2)

先在python里创建配置文件case.config,再运行文件class_peizhiwenjian_dangepianduan.py

输出结果如下:

DDT框架结合单元测试

数据类型

#来自文件class_peizhiwenjian_shujuleixing.pyimport configparsercf=configparser.ConfigParser()cf.read('case.config',encoding='utf-8')#根据数据类型讨论的问题print(type(cf.get('PYTHON11','num')))print(type(cf.get('PYTHON11','name')))#不管是数字还是其它数据类型,它到了配置文件里面都变成了字符串。

先在python里创建配置文件case.config,再运行class_peizhiwenjian_shujuleixing.py

输出结果如下:

DDT框架结合单元测试

所有片段

#来自文件class_peizhiwenjian_suoyoupianduan.pyimport configparsercf=configparser.ConfigParser()cf.read('case.config',encoding='utf-8')#读取配置文件的数据print(cf.sections())#拿到所有的片段print(cf.items('PYTHON11'))#根据你指定的片段拿到所有的items

先在python里创建配置文件case.config。

再运行文件 class_peizhiwenjian_suoyoupianduan.py

输出结果如下:

DDT框架结合单元测试

DDT跟unittest的结合使用+excel结合使用详细讲解

总结:两种unittest+excel

1)超继承 2)ddt

1.自己先写个类

2.unittest 进行单元测试,通过单元测试实现对自己写的类的测试。

3.Testcase里面写用例,断言self.assert,异常处理。

4.单元测试后进行参数化:

用例的相似度达到80%以上可以进行参数化,可以把数据写在代码里面,也可以把数据写在Excel里面。

在Excel里面需要用到openpyxl进行处理,处理数据的话用到三种方式。写成类:方法一,方法二,方法三。

参数化的方式有2种:超继承和DDT。推荐使用DDT。

先创建配置文件case1.config:

DDT框架结合单元测试

创建文件xh.xlsx文件:DDT框架结合单元测试

#来自文件http_request.pyimport requestsclass HttpRequest:    '''利用request封装get请求和post请求'''    def http_request(self,url,data,method,cookie=None):        '''url:请求的地址 http://xxx:port               param:传递的参数  非必填参数  字典的格式传递参数               method:请求方式支持get以及post  字符串形式的参数               cookie:请求的时候传递的cookie值'''        if method.lower()=='get':            res = requests.get(url, data, cookies=cookie)        else:            res=requests.post(url,data,cookies=cookie)#响应结果的消息实体 http response包含响应头,响应状态码,响应正文,Cookie        return res#返回一个消息实体if  __name__ =='__main__':    url = 'http://v.juhe.cn/laohuangli/d'    data =  {"key": "abf91475fc19f66c2f1fe567edd75257", "date": '2014-09-09'}    res=HttpRequest().http_request(url,data,'post')    print("登录结果是:", res.json())#充值    recharge_url='http://v.juhe.cn/laohuangli/d'    recharge_data= {"key": "abf91475fc19f66c2f1fe567edd75257", "date": '2014-09-09'}    recharges_res=HttpRequest().http_request(recharge_url,recharge_data,'get',res.cookies)    print("充值结果是:",recharges_res.json())

#来自文件get_data.pyclass GetData:    Cookie=None#存储cookie,初始值为None

#来自文件read_config.py#类 参数化 excel  执行指定的用例。import configparserclass ReadConfig:    def read_config(self,file_name,section,option):        cf=configparser.ConfigParser()        cf.read(file_name,encoding='utf-8')        return cf.get(section,option)if __name__ == '__main__':    res=ReadConfig().read_config('case1.config','MODE','mode')    print(res)

#来自文件do_excel_1#参数化,实现用例的可配置。from openpyxl import load_workbook#打开工作簿from do_config.read_config import ReadConfigclass DoExcel:    def __init__(self,file_name,sheet_name):        self.file_name=file_name        self.sheet_name=sheet_name    def get_data(self):#从配置文件读取mode值        mode=ReadConfig().read_config('case1.config','MODE','mode')        wb=load_workbook(self.file_name)        sheet=wb[self.sheet_name]#错误点2:写成了字符串['self.sheet_name'],所以报错。        test_data=[]        for i in range(2,sheet.max_row+1):            sub_data={}            sub_data['case_id'] = sheet.cell(i, 1).value            sub_data['module'] = sheet.cell(i, 2).value            sub_data['title'] = sheet.cell(i, 3).value            sub_data['method'] = sheet.cell(i, 4).value            sub_data['url']=sheet.cell(i,5).value            sub_data['data']=sheet.cell(i,6).value            sub_data['expected']=sheet.cell(i,7).value            test_data.append(sub_data)#存储了所有的数据。         #根据mode值去进行判断        if mode=='all':#执行所有的用例            final_data=test_data        else:#[do,2,3,4]传递列表,可以根据序号来执行所有的用例。            final_data=[]            for item in test_data:#对test_data所有的测试数据进行遍历                if item['case_id'] in eval(mode):                    final_data.append(item)        return final_data#返回获取到的数据if __name__ ==  '__main__':    print(DoExcel("xh.xlsx", "python").get_data())

#来自文件test_http_1.py#写用例写预期和断言import unittestfrom ddt import ddt,datafrom do_config.http_request import HttpRequestfrom do_config.get_data import GetDatafrom do_config.do_excel_1 import DoExceltest_data=DoExcel("xh.xlsx", "python").get_data()@ddtclass TestHttp(unittest.TestCase):    def setUp(self):        print("开始测试啦")    @data(*test_data)    def test_api(self,item):#接口用例            res=HttpRequest().http_request(item['url'],eval(item['data']),item['method'],getattr(GetData,'Cookie'))            if res.cookies:#如果cookie有的话,就更新COOKIE                  setattr(GetData,'Cookie',res.cookies)#反射            try:                self.assertEqual(str(item['expected']),res.json()['reason'])            except AssertionError as e:                print("test_api's error is{}".format(e))                raise e            print(res.json())    def tearDown(self):        pass

#来自文件test_suite_1.py#执行用例import unittestimport HTMLTestRunnerfrom do_config.test_http_1 import TestHttp#类名from do_config.do_excel_1 import  DoExcel#DDT loaderloader=unittest.TestLoader()suite=unittest.TestSuite()suite.addTest(loader.loadTestsFromTestCase(TestHttp))#执行with open("test_summer.html",'wb')as file:    runner=HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2,title=None,description=None,tester="清菡")    runner.run(suite)

#来自文件test_suite_1.py#执行用例import unittestimport HTMLTestRunnerfrom do_config.test_http_1 import TestHttp#类名from do_config.do_excel_1 import  DoExcel#DDT loaderloader=unittest.TestLoader()suite=unittest.TestSuite()suite.addTest(loader.loadTestsFromTestCase(TestHttp))#执行with open("test_summer.html",'wb')as file:    runner=HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2,title=None,description=None,tester="清菡")    runner.run(suite)

do_config文件夹下已创建文件get_data.py,文件http_request.py,文件read_config.py,文件do_excel_1.py,文件test_http_1.py,文件test_suite_1.py,xh.xlsx文件,case1.config文件,运行文件test_suite_1.py

输出结果如下:

DDT框架结合单元测试

补充

不能以Python中的模块名命名文件名,例如requests。它找文件的时候会在当前的环境变量下找,找不到的时候才会在配置的环境变量下的lib下找。

拓展:eval()只限于字符串的布尔值、字符串的元组、字符串的列表,字符串的数字转换成原本的数据类型。


欢迎扫码关注!

DDT框架结合单元测试

DDT框架结合单元测试

本文分享自微信公众号 - 清菡软件测试(qinghanTester)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这