在unittest中,测试用例是不能传self以外的参数的,否则会报错
import unittest
class TeatMath(unittest.TestCase):
# def test_add(self,q): # TypeError: TeatMath.test_add() missing 1 required positional argument: 'q'——>测试用例传参报错
def test_add(self):
a = 10
b = 20
print(a + b)
解决unittest中测试用例不能传self参数以外的参数问题,可以使用ddt传参 DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据) 通常情况下,data中的数据按照一个参数传递给测试用例,如果data中含有多个数据,以元组,列表,字典等数据,需要自行在脚本中对数据进行分解或者使用unpack分解数据。
import unittest
from ddt import ddt, data, unpack
test_data = [1, 3]
@ddt # 装饰测试类
class TestMath(unittest.TestCase):
@data(test_data)
def test_print_data(self, item):
print('item是{}:'.format(item))
知识补充——不定长参数:脱外套
def print_msg(*args):
print(args)
t = [1, 4]
# 脱外套
print(*t)
解决unittest中测试用例不能传self参数以外的参数问题,可以使用ddt传参,使用data装饰测试方法时,测试用例中只能添加一个self以外的参数
import unittest
from ddt import ddt, data, unpack
test_data = [[1, 3],[8,0]]
@ddt # 装饰测试类
class TestMath(unittest.TestCase):
# ddt中的data ——>def data(*values):
@data(*test_data) # 装饰测试方法,拿到几个数据,就执行几条用例
def test_print_data(self, item): # 使用data装饰测试方法时,测试用例中只能添加一个self以外的参数
print('item是{}:'.format(item))
unpack使用:
import unittest
from ddt import ddt, data, unpack
test_data = [[1, 3], [8, 0]]
@ddt # 装饰测试类
class TestMath(unittest.TestCase):
# * ——>脱去测试数据test_data的外套
@data(*test_data) # 装饰测试方法,拿到几个数据,就执行几条用例
@unpack # 如果data中含有多个数据,以元组,列表,字典等数据,需要自行在脚本中对数据进行分解或者使用unpack分解数据。如果不进行脱外套,就不需要使用unpack
def test_print_data(self, a, b): # 使用data装饰测试方法时,测试用例中只能添加一个self以外的参数,参数个数要与取到的数据一致
print('a是{}:,b是{}:'.format(a, b))
# -----------------------------------------------------------
# 当列表(字典、元组等)中元素中的子元素个数不同
import unittest
from ddt import ddt, data, unpack
test_data = [[1, 3], [8, 0,9]]
@ddt # 装饰测试类
class TestMath(unittest.TestCase):
# * ——>脱去测试数据test_data的外套
@data(*test_data) # 装饰测试方法,拿到几个数据,就执行几条用例
@unpack
def test_print_data(self, a=None, b=None, c=None): # 使用data装饰测试方法时,测试用例中只能添加一个self以外的参数,参数个数要与取到的数据一致,如果不一致,可以给出默认值;一般情况下,数据少的可以使用unpack,数据过多时不建议使用unpack
print('a是{}:,b是{},b是{}:'.format(a, b, c))
#-------------------------------------------------------------
如果想要对字典进行unpack,参数名与字典的key对应
import unittest
from ddt import ddt, data, unpack
test_data = [{'name': '暖暖', 'age': 11}, {'name': 'lili', 'age': 19}]
@ddt
class TestMsg(unittest.TestCase):
@data(*test_data) # ***使用unpack记得脱外套
@unpack
def test_print_msg(self, name, age):
print('name是{},age是{}'.format(name, age))
ddt+excel结合使用 1:创建一个http请求
import requests
# 课堂派 登录、查询请求
class HttpRequest:
"""利用requests封装get请求和post请求"""
def http_request(self, deng_url, deng_data, method, cookie=None): # url、data、cookie 参数化
"""url:请求的地址 http://xxxx:port
param(参数):传递的参数,非必填参数,字典格式传递参数
method:请求方式,支持get以及post请求
cookie:请求的时候传递的cookie值"""
# 登录
if method.lower() == 'get':
deng_res = requests.get(deng_url, json=deng_data, cookies=cookie) # 响应结果的消息实体
else:
deng_res = requests.post(deng_url, json=deng_data, cookies=cookie) # 响应结果的消息实体
return deng_res # 返回一个消息实体
2:创建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_data(self):
wb = load_workbook(self.file_name)
sheet = wb[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('nuannuan.xlsx', 'nuannuan_04').get_data())
3:创建一个反射测试类
class GetData:
Cookie = None # 存储cookie,初始值None
4:创建一个测试用例类
import unittest
from ddt import ddt, data
from class_014.class_ddt_excel.class_http_request import HttpRequest
from class_014.class_ddt_excel.get_data import GetData
from class_014.class_ddt_excel.do_excel import DoExcel
test_data = DoExcel('nuannuan.xlsx', 'nuannuan_04').get_data()
@ddt
class TestKeTang(unittest.TestCase):
def setUp(self): # 初始化,属性可以被实例调用,可以被类函数里面调用
pass
@data(*test_data)
def test_api(self, item): # 接口用例
# 测试用例只能通过初始化传参,不能通过测试用例传参,测试用例只能有一个参数self
res = HttpRequest().http_request(item['url'], eval(item['data']), item['method'], getattr(GetData, 'Cookie'))
if res.cookies: # 如果cookie有的话,那么就会更新COOKIE,setattr()函数可以直接将类里面的属性做修改
setattr(GetData, 'Cookie', res.cookies)
print(res.json())
try:
self.assertEqual(item['expected'], res.json()['code'])
except AttributeError as e:
print('test_api‘s error is{0}!!!!!'.format(e))
raise e
def tearDown(self):
print('用例执行完毕!!!!!')
5:执行测试用例,并获取测试报告
import unittest
import HTMLTestRunnerNew
from class_014.class_ddt_excel.class_lei import TestKeTang
# 避坑——>使用ddt,使用loader加载用例
# 存储用例,加载数据
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestKeTang))
with open('test_kt_report.html', 'wb') as file:
runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2, title='python“课堂派”单元测试报告',
description='报告描述:自动化课堂派测试报告', tester='暖暖')
runner.run(suite)
excel说明: