一、@ddt 处理字典 test_data = [[1, 2], [4, 5, 6]]
# ddt ddt+unitteat来进行数据的处理 第三方库
# 装饰器 会在你的函数之前运行 不会改变代码的结构
import unittest
from ddt import ddt, data, unpack
test_data = [[1, 2], [4, 5, 6]]
# 装饰测试类
@ddt
class TestMath(unittest.TestCase):
@data(test_data)
def test_print_data1(self, a): # 测试用例
print("a:", a)
# 脱外套*test_data 自动拆分为1,3
@data(*test_data) # 装饰测试方法 拿到几个数据 就执行几条用例
def test_print_data2(self, b): # 测试用例
print("b:", b)
@data(*test_data)
#不定长输出,针对于两个返回值长度不相等的情况 test_data = [[1, 2], [4, 5, 6]]
def test_print_data3(self, *a): # 测试用例
print("不定长输出:", a)
@data(*test_data)
#如果unpack后的参数少于5个 推荐使用unpack 要注意参数不对等的情况,提供对应个数的参数来接收这个变量
@unpack
def test_print_data4(self, a=None, b=None, c=None): # 测试用例
print("a:", a)
print("b:", b)
print("c:", c)
if __name__ == "__main__":
unittest.main()
二、@ddt 处理列表嵌套字典
import unittest
from ddt import ddt, data, unpack
#列表嵌套字典
test_data = [{"no":1,"name":"xinxin"},{"no":2,"name":"binbin"}]
# 装饰测试类
@ddt
class TestMath(unittest.TestCase):
@data(*test_data)
def test_print_data1(self, a): # 测试用例
print("no:", a['no'])
print("name:", a['name'])
@data(*test_data)
#如果你要对字典进行Unpack 参数名与你的字典key对应
@unpack
def test_print_data2(self, no , name): # 测试用例
print("no:", no)
print("name:",name)
if __name__ == "__main__":
unittest.main()
三、ddt+Unittest+excel的结合使用
a.请求函数
import requests
class HttpRequest():
def http_request(self, url, data, method, cookie=None):
if method.lower() == "get":
# verify=False忽略证书 ssl
res = requests.get(url, data, cookies=cookie, verify=False)
return res
elif method.lower() == "post":
res = requests.post(url, data, cookies=cookie, verify=False)
return res # 返回的是一个消息实体
else:
raise Exception('不支持的请求')
b.存在依赖关系,编写反射函数
class GetData:
Cookie = '小郭'
setattr(GetData,'Cookie','小黄')
print(GetData.Cookie)
c.读取excel函数
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 是一个列表 索引是从0开始的
header=self.get_header()
test_data=[]
for i in range(2,sheet.max_row+1):
sub_data = {}
sub_data['url'] = url = sheet.cell(i, 4).value
sub_data['data'] = data = sheet.cell(i, 5).value
sub_data['http_method'] = method = sheet.cell(i, 6).value
sub_data['expected'] = expected = sheet.cell(i, 7).value
test_data.append(sub_data)
#返回获取到的数据
return test_data
if __name__ == '__main__':
print(DoExcel(r"D:\PycharmProjects\class_01\testcase_02\test.xlsx",'test').get_data())
d.测试用例
import unittest
from ddt import ddt,data,unpack
from testcase_01.test_http import HttpRequest
from testcase_01.test_reflect import GetData
from testcase_02.do_excel import DoExcel
test_data = []
t=DoExcel(r"D:\PycharmProjects\class_01\testcase_02\test.xlsx", 'test').get_data()
@ddt
class TestHttp(unittest.TestCase):
def setUp(self):
print("我已经开始测试用例了")
#内部装饰器,对数据进行遍历、拆分,传给测试用例
@data(*test_data)
def test_api(self,item):
res = HttpRequest().http_request(eval(item['url']), eval(item['data']), item['http_method'],getattr(GetData,'Cookie'))
if res.cookies:
setattr(GetData, 'Cookie', 'res.cookies')
try:
self.assertEqual(str(item['expected']), res.json()['code'])
except Exception as e:
print("test_api's error is {0}".format(e))
raise e
print(res.json())
def tearDown(self):
print("我已经执行完毕测试用例了")
c.测试报告
# ..成功 F失败 1代码错误
import unittest
import HTMLTestRunner
import time
from testcase_01.test_case import TestHttp # 具体到类名
from testcase_02.do_excel import DoExcel
#当使用ddt,不能用实例方式去加载用例,这样数据传不进去,我们只需要等待ddt把数据加载之后,再通过模块发现就可以了
suite = unittest.TestSuite() # 存储用例
loader = unittest.TestLoader()
suit.addTest(Loader.loadTestsFromTestCase(TestHttp))
if __name__ == "__main__":
time1 = time.strftime("%Y-%m-%d %H-%M-%S")
name1 = time1 + "report.html"
with open(name1, 'wb') as file:
runner = HTMLTestRunner.HTMLTestRunner(
stream=file,
title="单元测试报告",
description="测试用例执行统计1",
verbosity=2
)
runner.run(suite)
四、学习总结
#两种unittest+excel 1)超继承 2)ddt
#unittest 单元测试 通过单元测试 实现对自己写的类的测试
#TestCase self.assert异常处理
#类
#参数化 %80 EXCEL openpyxl
#写成类 方法一、方法二、方法三
#超继承---》原理要懂 DDT---》推荐使用