027python-ddt

文章介绍了在Python的unittest框架中,如何通过ddt库解决测试用例传参的问题。使用ddt可以方便地进行数据驱动测试,通过data装饰器传入测试数据,并使用unpack处理多参数的情况。此外,还展示了如何结合Excel进行自动化测试,包括读取Excel数据、创建HTTP请求以及生成HTML测试报告。
摘要由CSDN通过智能技术生成
在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说明:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值