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

网站不稳定有什么影响腾讯云免费云服务器

网站不稳定有什么影响,腾讯云免费云服务器,安阳专业seo地址,在线网站建设哪家好用 python 做过自动化的小伙伴#xff0c;大多数都应该使用过 ddt 这个模块#xff0c;不可否认 ddt 这个模块确实挺好用#xff0c;可以自动根据用例数据#xff0c;来生成测试用例#xff0c;能够很方便的将测试数据和测试用例执行的逻辑进行分离。 接下来就带大家一起…用 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账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from333.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.hkea.cn/news/14400340/

相关文章:

  • 湖北正规网站建设检修东莞常平新楼盘
  • 河北新亚建设集团网站江苏嘉力电力建设有限公司网站
  • 网站建设报告内容机械网站建设公司推荐
  • 微信分销网站建设做网站的需求清单
  • 海外网站建站门户网站app
  • 辽宁品牌建设促进会 网站小企业网站价格
  • 陕西省交通建设集团商界分公司网站对外宣传及网站建设文件稿
  • 网站制作公司有哪些移植wordpress数据库
  • 网站建设教程纯正苏州久远网络哪网站建设
  • 外贸建站优化做报名网站
  • 网站设计是什么网站建设战略伙伴
  • 公司网站开发费用放在什么科目如何免费注册网站平台
  • 成都专业网站建设哪家好网站描述怎么写利于seo
  • 重庆制作网站速成班网站设计主色学校
  • 成都网站开发的公司多个wordpress站点互相
  • 长沙网站建设公司有哪些个人婚礼网站设计
  • 汉中网站网站建设大丰网站建设价格
  • 功能介绍的网站网站制作公司大型
  • dedecms可以做什么网站番禺人才网单位招考
  • 百度认证考试许昌seo推广
  • 做网站大公司哪个网站可以做销售记录
  • 寺庙网站建设足球最新比赛消息
  • 新闻发布的网站静态网站开发用到的技术
  • 快手刷赞网站推广软件敬请期待英文翻译
  • 想在意大利做购物网站仿36氪wordpress
  • 做一个高端网站多少钱品质好货
  • 饮料网站模板莞城网页设计
  • 深圳产品推广网站建设方案做网站需要营业执照嘛
  • 虚拟主机 删除网站缓存建立网站费用怎么做会计分录
  • vs2010c 做网站郑州网站开发设计公司电话