当前位置: 首页 > news >正文

经常投诉网站快照东莞网站建设外包

经常投诉网站快照,东莞网站建设外包,小说素材网站,做网站阿里云记录值怎么填用 python 做过自动化的小伙伴,大多数都应该使用过 ddt 这个模块,不可否认 ddt 这个模块确实挺好用,可以自动根据用例数据,来生成测试用例,能够很方便的将测试数据和测试用例执行的逻辑进行分离。 接下来就带大家一起…

用 python 做过自动化的小伙伴,大多数都应该使用过 ddt 这个模块,不可否认 ddt 这个模块确实挺好用,可以自动根据用例数据,来生成测试用例,能够很方便的将测试数据和测试用例执行的逻辑进行分离。

接下来就带大家一起手把手撸出一个 ddt:

1、DDT 的实现原理

首先我们来看一下 ddt 的基本使用:

图片

ddt 在使用时非常简洁,也就是两个装饰器,@ddt 这个装饰器装饰测试类,@data 这个装饰器装饰器用例方法并传入测试数据。这两个装饰器实现的效果就是根据传入的用例数据自动生成用例。

如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click

具体是怎么实现的呢?其实实现的思路也特别的简单,也就两个步骤:

第一步:把传进来的用例数据保存起来

第二步:遍历用例数据,每遍历一条数据 就动态的给测试类添加一个用例方法。

ddt 中的两个装饰器其实实现的就是这么两个步骤:

@data:做的是第一步将传入测试数据保存起来;

@ddt 做的是第二步,遍历用例数据,给测试类动态添加用例方法。

2、data 装饰器的实现

前面我们说到 data 这个装饰器,做的事情是将用例数据保存起来。

那么如何保存呢?其实最简单的方式就是保存被装饰的这个用例方法的属性。

接下来我们来具体实现:

先看一个 ddt 使用的案例

@ddt
class TestLogin(unittest.TestCase):@data(11,22)def test_login(self, item):pass

了解过装饰器装饰器原理的小伙伴,应该都知道上面@data(11,22) 这行代码执行的效果等同于

test_login = data(11,22)(test_login)

接下来我们来分析一下上面这行代码,首先是调用 data 这个装饰器函数,把用例数据 11,22 当成参数传入进去,然后返回一个可调用对象(函数),再次调用返回的函数并把用例方法传入进去。明确了调用的流程,那么我们就可以结合之前的需求去定义 data 这个装饰器函数了。

具体实现如下:

def data(*args):def wrapper(func):setattr(func, "PARAMS", args)return funcreturn wrapper

代码解读:

前面的案例在使用 data 时,执行的 test_login = data(11,22)(test_login)
先调用 data 传入的 11,22 通过不定长参数 args 接收,然后返回嵌套的函数 wrapper
然后调用返回的 wrapper 函数,传入被装饰的 test_login 方法
在 wrapper 函数中我们把用例数据保存为 test_login 这个方法的 PARAMS 属性,再把 test_login 返回
到此为止,data 这个装饰器我们就实现用例数据的保存

3、ddt 装饰器的实现

通过 data 这个装饰器我们实现了用例数据保存之后,我们接下来实现 ddt 这个装饰器,根据用例数据生成测试用例。前面的案例 @ddt 装饰测试类的时候,实际上执行的效果等同于下面的代码

TestLogin = ddt(TestLogin)

这行代码就是把被装饰器的类传入到 ddt 这个装饰器函数中,再把返回值赋值给 TestLogin。之前我们分析的时候说了 ddt 这个装饰器做的事情是遍历用例数据,动态的给测试类添加用例方法。

接下来我们就来实现 ddt 这个装饰器内部的逻辑。

def ddt(cls):for name, func in list(cls.__dict__.items()):if hasattr(func, "PARAMS"):for index, case_data in enumerate(getattr(func, "PARAMS")):new_test_name ="{}_{}".format(name,index)setattr(cls, new_test_name, func)else:delattr(cls, name)return cls

代码解读:

ddt 函数内部逻辑说明:
1、调用 ddt 这个函数时会把测试类当成参数传入进来,
2、然后通过 cls.__dict__ 获取测试的所有属性和方法,进行遍历
3、判断变量出来的属性或方法 有没有 PARAMS 这个属性,
4、如果有,则说明这个方法用 data 装饰器装饰过并传入了用例数据。
5、通过 getattr(func, "PARAMS")获取所有的用例数据,进行遍历。
6、每遍历出来一组用例数据,生产一个用例方法名, 再动态的给测试类添加一个用例方法。
7、遍历完所有用例数据之后,删除测试类原来定义的测试方法
8、最后返回测试类

当目前为止 ddt 和 data 这两个装饰器函数的基本功能实现了,可以自动根据用例数据生成测试用例了,接下来我们写个测试类来检查一下

# 定义装饰器函数data
def data(*args):def wrapper(func):setattr(func, "PARAMS", args)return funcreturn wrapper# 定义装饰器函数ddt
def ddt(cls):for name, func in list(cls.__dict__.items()):if hasattr(func, "PARAMS"):for index, case_data in enumerate(getattr(func, "PARAMS")):new_test_name = "{}_{}".format(name, index)setattr(cls, new_test_name, func)else:delattr(cls, name)return clsimport unittest# 编写测试类
@ddt
class TestDome(unittest.TestCase):@data(11, 22, 33, 44)def test_demo(self):pass

运行上述用例,我们就会发现执行了四条用例,根据用例数据生成用例的功能就已经实现了

4、解决用例参数传递的问题

虽然上面基本的功能已经实现了,但是还存在一个问题:用例的数据没有传递到用例方法中。那么用例数据传递怎么实现了,我们可以通过一个闭包函数对用例方法进行修,从而实现在调用用例方法的时候,把用例测试当成参数传递进去。

修改原有用例方法的函数代码如下

from functools import wrapsdef update_test_func(test_func,case_data):@wraps(test_func)def wrapper(self):return test_func(self, case_data)return wrapper

代码解读:

上面我们定义了一个叫做 update_test_func 的闭包函数
闭包函数接收两个参数:test_func(接收用例方法),case_data(接收用例数据)
闭包函数返回一个嵌套函数,嵌套函数内部调用原来的用例方法,并传入测试数据
嵌套函数在定义时,使用了 functools 模块中的装饰器 wraps 来装饰,它可以让 wrapper 这个嵌套函数具有 test_func 这个用例函数的相关属性。

下面我们回到前面写的 ddt 这个函数中,在给测试类添加用例之前,调用 update_test_func 方法对用例方法进行修改:

def ddt(cls):for name, func in list(cls.__dict__.items()):if hasattr(func, "PARAMS"):for index, case_data in enumerate(getattr(func, "PARAMS")):# 生成一个用例方法名new_test_name = "{}_{}".format(name, index)# 修改原有的测试方法,设置用例数据为测试方法的参数test_func = update_test_func(func,case_data)setattr(cls, new_test_name, test_func)else:delattr(cls, name)return cls

通过加上这一步之后,我们在测试类中 动态给测试类添加的测试方法,其实指向的全部是 update_test_func 里面定义的 wrapper 函数,在执行测试用的时候实际上也是执行的 wrapper 函数,而在 wrapper 函数内部,我们调用了原来定义的测试方法,并将用例数据传入了进去。

到此为止 ddt 的功能我们就完全实现了!

End:

给大家举一个完整的案例,大家可以复制过去运行,也可以自己去写一遍,还可以根据自己的一些需求进行自定义的扩展。

完整案例


from functools import wraps
import unittest# --------ddt的实现--------
def data(*args):def wrapper(func):setattr(func, "PARAMS", args)return funcreturn wrapperdef update_test_func(test_func, case_data):@wraps(test_func)def wrapper(self):return test_func(self, case_data)return wrapperdef ddt(cls):for name, func in list(cls.__dict__.items()):if hasattr(func, "PARAMS"):for index, case_data in enumerate(getattr(func, "PARAMS")):# 生成一个用例方法名new_test_name = "{}_{}".format(name, index)# 修改原有的测试方法,设置用例数据为测试方法的参数test_func = update_test_func(func, case_data)setattr(cls, new_test_name, test_func)else:delattr(cls, name)return cls# --------测试用例编写--------
@ddt
class TestDome(unittest.TestCase):@data(11, 22, 33, 44)def test_demo(self, data):assert data < 40
#---------用例执行-----------
unittest.main()

http://www.yayakq.cn/news/829600/

相关文章:

  • 河南零距离文化传播 网站建设建行企业手机银行下载安装
  • 金阊seo网站优化软件网站开发jsp
  • 网站ico怎么用网站开发综合技能实训心得体会
  • 代替做网站推广2003 iis wordpress
  • 明星网页网站制作本地门户网站系统
  • 12306铁路网站开发语言遵义花果园网站建设
  • 阿里云网站建设流程教案网页设计和网站开发
  • 在线网页制作网站织梦做的的网站首页显示空白
  • 沧州网站开发建网站价格 建设网站需要多少钱
  • 班级的网站设计怎么做天津市建筑信息网
  • 课程网站建设技术服务公司网站建设
  • 做音乐 交流网站泰安人力资源招聘
  • 一个具体网站的seo优化上海h5网站建设
  • 成都网站优化推广方案wordpress需要安装哪些插件
  • 网站后台怎么做qq群自动加网站开发 加密保护
  • 怎样修改网站的主页内容建设银行大连招聘网站
  • 微信怎么建设自己网站wordpress博客登陆
  • 长沙网站seo服务wordpress列表分页代码
  • 网站开发外贸客户判断网站到期
  • 管理有限公司网站设计网页设计与网站建设课程
  • 网站建站中关键字搜索怎么弄哪个网站ppt模板免费下载
  • 有名的网站制作公司做阿里巴巴类似的网站吗
  • 小网站关键词搜什么wordpress导航标签文件在哪
  • 如何快速提升网站权重wordpress博客模板下载
  • 罗湖网站开发秘密入口3秒自动进入
  • 网站打不开 ...深圳公司网站建设设计
  • 免费自动建站站长工具是做什么的
  • 郑州做网站推广电话易优cms收费吗
  • 辛集市建设局网站商城建站流程
  • .net 网站 语言新公司起名大全集