Unittest 之 DDT 的原理解析

引言

  前面的文章介绍了如何在 Python 的 Unittest 框架中来使用 ddt 实现数据驱动的自动化测试。


在了解了 ddt 的使用后,你是否有过如下疑问:

  • ddt 是如何把你的测试数据转换传给你的测试用例?

  • 当你的一组数据有多个参数时,ddt 是如何 unpack 的?

  • 当你有多组数据时,ddt 拆分测试用例是如何命名的?

 

主题:今天分享的内容是--探索 ddt 实现数据驱动的秘密。

  通过阅读ddt 源码,我们不难发现其实 ddt 的实现核心就是@ddt(cls)这个装饰器,而这个装饰器的核心代码是 wrapper这个类函数,下面我直接把 wrapper 的源码贴上来,大家一起看看:

def wrapper(cls):
    # 先遍历被装饰类的name, 和func
    # 对于func,先看被装饰的是DATA_ATTR还是FILE_ATTR
    for name, func in list(cls.__dict__.items()):
        # 如果被装饰的是DATA_ATTR
        if hasattr(func, DATA_ATTR):
            #获取@data提供数据的index和内容并且遍历它们
            for i, v in enumerate(getattr(func, DATA_ATTR)):
                # 重新生成新的测试函数名,这个函数名会展示在测试报告中
                test_name = mk_test_name(
                    name,
                    getattr(v, "__name__", v),
                    i,
                    fmt_test_name
                )
                test_data_docstring = _get_test_data_docstring(func, v)
                # 如果类函数被@unpack装饰
                if hasattr(func, UNPACK_ATTR):
                    # 如果提供的数据是tuple或者list
                    if isinstance(v, tuple) or isinstance(v, list):
                        # 则添加一个case到测试类中
                        # list或tuple传不定数目的值, 用*v即可。
                        add_test(
                            cls,
                            test_name,
                            test_data_docstring,
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu_Candy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值