DDT框架结合单元测试

文章总览图

  • Excel读写测试数据

  • python配置文件的类封装

  • DDT框架原理以及使用

  • DDT框架结合单元测试

读取数据的方式

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

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

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

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

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

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

Excel处理

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

先创建一个xh.xlsx文件。

#来自文件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)

运行结果如下:

#来自文件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'>

输出结果如下:

三种方法读取数据

1#来自文件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()) 2 3#来自文件get_data.pyclass GetData: Cookie=None#存储cookie,初始值为None

方法一

一次性读取所有的数据。

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

1#来自文件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之间的值,1234 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()) 2 3#来自文件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 4 5#来自文件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

输出结果如下:

方法二

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

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

#方法二

1#来自文件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) 2 3#来自文件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 4 5#来自文件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进行参数化。

创建文件xh.xlsx文件:

#来自文件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

输出结果如下:

1# 来自文件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()) 2 3#来自文件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 4 5#来自文件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

输出结果如下:

脱外套

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

输出结果如下:

不用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

输出结果如下:

列表嵌套字典,对字典进行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

输出结果如下:

配置文件

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

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

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

输出结果如下:

数据类型

#来自文件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

输出结果如下:

所有片段

#来自文件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跟unittest的结合使用+excel结合使用详细讲解

总结:两种unittest+excel

1)超继承 2)ddt

1.自己先写个类

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

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

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

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

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

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

先创建配置文件case1.config:

创建文件xh.xlsx文件:

1#来自文件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()) 2 3#来自文件get_data.pyclass GetData: Cookie=None#存储cookie,初始值为None 4 5#来自文件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) 6 7#来自文件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()) 8 9#来自文件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 10 11#来自文件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) 12 13#来自文件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

输出结果如下:

补充

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

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


欢迎扫码关注!

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )