在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,初始值None4:创建一个测试用例类
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说明:



















