文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python怎么将一个类方法变为多个方法

2023-06-16 16:53

关注

本篇内容主要讲解“Python怎么将一个类方法变为多个方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么将一个类方法变为多个方法”吧!

1、ddt 如何实现参数化?

先回顾一下上篇文章中 ddt 库的写法:

import unittest from ddt import ddt,data,unpack @ddt class MyTest(unittest.TestCase):     @data((3, 1), (-1, 0), (1.2, 1.0))     @unpack     def test(self, first, second):         pass

ddt 可提供 4 个装饰器:1 个加在类上的 @ddt,还有 3 个加在类方法上的 @data、@unpack 和  @file_data(前文未提及)。

先看看加在类方法上的三个装饰器的作用:

# ddt 版本(win):1.2.1 def data(*values):     global index_len     index_len = len(str(len(values)))     return idata(values)  def idata(iterable):     def wrapper(func):         setattr(func, DATA_ATTR, iterable)         return func     return wrapper  def unpack(func):     setattr(func, UNPACK_ATTR, True)     return func  def file_data(value):     def wrapper(func):         setattr(func, FILE_ATTR, value)         return func     return wrapper

它们的共同作用是在类方法上 setattr() 添加属性。至于这些属性在什么时候使用?下面看看加在类上的 @ddt 装饰器源码:

Python怎么将一个类方法变为多个方法

Python怎么将一个类方法变为多个方法

第一层 for 循环遍历了所有的类方法,然后是 if/elif 两条分支,分别对应  DATA_ATTR/FILE_ATTR,即对应参数的两种来源:数据(@data)和文件(@file_data)。

elif 分支有解析文件的逻辑,之后跟处理数据相似,所以我们把它略过,主要看前面的 if 分支。这部分的逻辑很清晰,主要完成的任务如下:

Python怎么将一个类方法变为多个方法

分析源码,可以看出,@data、@unpack 和 @file_data 这三个装饰器主要是设置属性并传参,而 @ddt  装饰器才是核心的处理逻辑。

这种将装饰器分散(分别加在类与类方法上),再组合使用的方案,很不优雅。为什么就不能统一起来使用呢?后面我们会分析它的难言之隐,先按下不表,看看其它的实现方案是怎样的?

2、parameterized 如何实现参数化?

先回顾一下上篇文章中 parameterized 库的写法:

import unittest from parameterized import parameterized class MyTest(unittest.TestCase):     @parameterized.expand([(3,1), (-1,0), (1.5,1.0)])     def test_values(self, first, second):         self.assertTrue(first > second)

它提供了一个装饰器类 @parameterized,源码如下(版本 0.7.1),主要做了一些初始的校验和参数解析,并非我们关注的重点,略过。

Python怎么将一个类方法变为多个方法

我们主要关注这个装饰器类的 expand() 方法,它的文档注释中写到:

A "brute force" method of parameterizing test cases. Creates new test cases  and injects them into the namespace that the wrapped function is being defined  in. Useful for parameterizing tests in subclasses of 'UnitTest', where Nose test  generators don't work.

关键的两个动作是:“creates new test cases(创建新的测试单元)”和“inject them into the  namespace…(注入到原方法的命名空间)”。

关于第一点,它跟 ddt 是相似的,只是一些命名风格上的差异,以及参数的解析及绑定不同,不值得太关注。

Python怎么将一个类方法变为多个方法

最不同的则是,怎么令新的测试方法生效?

parameterized 使用的是一种“注入”的方式:

Python怎么将一个类方法变为多个方法

inspect 是个功能强大的标准库,在此用于获取程序调用栈的信息。前三句代码的目的是取出 f_locals,它的含义是“local namespace  seen by this frame”,此处 f_locals 指的就是类的局部命名空间。

说到局部命名空间,你可能会想到 locals(),但是,我们之前有文章提到过“locals() 与 globals() 的读写问题”,locals()  是可读不可写的,所以这段代码才用了 f_locals。

3、pytest 如何实现参数化?

按惯例先看看上篇文章中的写法:

import pytest @pytest.mark.parametrize("first,second", [(3,1), (-1,0), (1.5,1.0)]) def test_values(first, second):     assert(first > second)

首先看到“mark”,pytest 里内置了一些标签,例如  parametrize、timeout、skipif、xfail、tryfirst、trylast  等,还支持用户自定义的标签,可以设置执行条件、分组筛选执行,以及修改原测试行为等等。

用法也是非常简单的,然而,其源码可复杂多了。我们这里只关注 parametrize,先看看核心的一段代码:

Python怎么将一个类方法变为多个方法

根据传入的参数对,它复制了原测试方法的调用信息,存入待调用的列表里。跟前面分析的两个库不同,它并没有在此创建新的测试方法,而是复用了已有的方法。在  parametrize() 所属的 Metafunc 类往上查找,可以追踪到 _calls 列表的使用位置:

Python怎么将一个类方法变为多个方法

最终是在 Function 类中执行:

Python怎么将一个类方法变为多个方法

好玩的是,在这里我们可以看到几行神注释……

Python怎么将一个类方法变为多个方法

阅读(粗浅涉猎) pytest  的源码,真的是自讨苦吃……不过,依稀大致可以看出,它在实现参数化时,使用的是生成器的方案,遍历一个参数则调用一次测试方法,而前面的 ddt 和  parameterized 则是一次性把所有参数解析完,生成 n 个新的测试方法,再交给测试框架去调度。

对比一下,前两个库的思路很清晰,而且由于其设计单纯是为了实现参数化,不像 pytest 有什么标记和过多的抽象设计,所以更易读易懂。前两个库发挥了  Python 的动态特性,设置类属性或者注入局部命名空间,而 pytest 倒像是从什么静态语言中借鉴的思路,略显笨拙

到此,相信大家对“Python怎么将一个类方法变为多个方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯