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

重庆江北区网站建设品牌网站建设公司

重庆江北区网站建设,品牌网站建设公司,动态图网站怎么做dw,wordpress购物主题元类在测试框架中的运用 书接上回 我们知道了元类的基本用法,也写了一个小demo,接下来我们就尝试运用进我们测试框架。 #一款无需编码且易用于二次开发的接口测试框架。 #我写的我写的我写的我写的 pip install mwj-apitest #这里面就用到了元类&…

元类在测试框架中的运用

书接上回

我们知道了元类的基本用法,也写了一个小demo,接下来我们就尝试运用进我们测试框架。

#一款无需编码且易用于二次开发的接口测试框架。
#我写的我写的我写的我写的
pip install mwj-apitest
#这里面就用到了元类,教程还在写,有兴趣的可以玩一玩,还有一些bug,还有很多地方没完善,前几天让一位大佬帮忙测试了,windows和mac都可以运行哦。
#目前最新版本是1.2.3

知识回顾

type(name, bases, dcit)
- name : 表示要创建的类的名称。(字符串类型)
- bases : 继承类的基类元组(或包含基类的元类)。(元组类型)
- dict : 类属性和方法。(字典类型)

动态创建用例

#  使用type去创建用例类
from unittest import TestCase# 通过type动态去生成测试类
MyTest = type('MyTest', (TestCase,), {"cases": [11, 22, 33, 44], 'test_1': lambda x: x, 'test_2': lambda x: x})if __name__ == '__main__':import unittestimport unittestreportsuite = unittest.defaultTestLoader.loadTestsFromTestCase(MyTest)unittestreport.TestRunner(suite).run()

运行结果:

test_1 (__main__.MyTest)执行——>【通过】
test_2 (__main__.MyTest)执行——>【通过】
所有用例执行完毕,正在生成测试报告中......
测试报告已经生成,报告路径为:./reports\report.html

上面通过元类动态创建测试类及测试方法部分的代码等同于如下代码:

from unittest import TestCase
class MyTest(TestCase):cases = [11, 22, 33, 44]test_1 = lambda x: xtest_2 = lambda x: x

等价于:

from unittest import TestCaseclass MyTest(TestCase):cases = [11, 22, 33, 44]@classmethoddef test_1(cls, x):return x@classmethoddef test_2(cls, x):return x

自定义解析测试用例的元类

准备一手测试数据,在同级目录下创建test_data.json文件

[{"title": "测试用例1","data": "参数1"},{"title": "测试用例2","data": "参数2"},{"title": "测试用例3","data": "参数3"}
]
from functools import wraps
import unittestdef update_test_func(func, value):@wraps(func)def wrapper(self, **kwargs):return func(self, value)return wrapperclass MyMateClass(type):def __new__(cls, name, bases, attrs, *args, **kwargs):# 通过元类创建一个类test_cls = super().__new__(cls, name, bases, attrs)# 遍历属性Casesfor index, value in enumerate(attrs['Cases']):# func =test_cls.test_performfunc = getattr(test_cls, 'perform')test_func = update_test_func(func, value)# 动态给test_cls这个类 添加方法setattr(test_cls, 'test_{}'.format(index), test_func)return test_clsclass BaseApiCase:"""用例执行的基本类"""def perform(self, case):"""用例执行的方法"""print("测试数据:", case)# 1、用例数据的处理# 2、接口请求# 3、响应数据提取# 4、断言if __name__ == '__main__':import unittestreportimport json# 通过自定义的元类创建类with open('test_data.json', 'r', encoding='utf-8') as f:cases = {'Cases': json.load(f)}Xiaozai = MyMateClass('Xiaozai', (unittest.TestCase, BaseApiCase), cases)# # 加载测试类的用例到测试套件suite = unittest.defaultTestLoader.loadTestsFromTestCase(Xiaozai)# 运行用例unittestreport.TestRunner(suite, templates=2).run()

执行结果如下:

测试数据: {'title': '测试用例1', 'data': '参数1'}
test_0 (__main__.Xiaozai)执行——>【通过】
测试数据: {'title': '测试用例2', 'data': '参数2'}
test_1 (__main__.Xiaozai)执行——>【通过】
测试数据: {'title': '测试用例3', 'data': '参数3'}
test_2 (__main__.Xiaozai)执行——>【通过】
所有用例执行完毕,正在生成测试报告中......
测试报告已经生成,报告路径为:./reports\report.html

代码解析

这段代码实现了一个自定义元类MyMateClass,通过该元类动态创建测试用例类Xiaozai

  1. 导入需要的模块:
    • wraps函数:用于保留被装饰函数的元信息。
    • unittest模块:包含了用于编写和运行单元测试的功能。
    • unittestreport模块:一个第三方模块,用于生成测试报告。
      • 可以通过pip install unittestreport进行下载。
    • json模块:用于处理和解析JSON数据。
  2. 定义修饰器函数update_test_func
    • 该函数接受一个测试方法和参数值作为输入。
    • 在内部定义一个装饰器函数wrapper,用于修改测试方法的调用方式。
    • wrapper函数将调用被装饰的测试方法,传递参数值作为参数,并返回结果。
    • 最后,将装饰器函数wrapper返回。
  3. 定义元类MyMateClass
    • 重写__new__方法,在创建新类时动态添加测试方法。
    • 遍历attrs['Cases']中的测试用例数据。
    • 通过调用getattr函数获取基类BaseApiCase中的测试方法perform
    • 使用修饰器函数update_test_func对测试方法进行修饰,并设置修饰后的方法名为'test_{}'.format(index)。test_0,test_1,test_2。
    • 使用setattr函数将修饰后的测试方法添加到新创建的类test_cls中。
  4. 定义基类BaseApiCase
    • BaseApiCase类定义了一个名为perform的测试方法,该方法接受一个参数case
    • 在该方法中,打印了测试用例数据,并且可以进行数据处理、接口请求、响应数据提取和断言等操作。
  5. __main__中运行测试用例:
    • 通过open函数打开测试用例数据文件,并加载JSON数据。
    • 创建包含测试用例数据的字典cases
    • 使用自定义的元类MyMateClass创建测试用例类Xiaozai,该类继承自unittest.TestCaseBaseApiCase
    • 使用unittest.defaultTestLoader.loadTestsFromTestCase函数,将测试用例类中的用例加载到测试套件中。
    • 创建unittestreport.TestRunner对象,并使用run方法运行测试套件,生成测试报告。

知识点扩展setter()

源码展示:

def setattr(x, y, v): # real signature unknown; restored from __doc__"""Sets the named attribute on the given object to the specified value.setattr(x, 'y', v) is equivalent to ``x.y = v''"""pass

setattr(x, y, v)函数是Python内置函数之一,用于设置对象x的属性y的值为v。具体解析如下:

  • x:表示需要设置属性的对象。
  • y:表示需要设置的属性名。
  • v:表示需要设定的属性值。

setattr(x, y, v)函数的作用是将对象x的属性y设置为值v。可以用于动态地为对象添加属性或者修改已有属性的值。如果属性不存在,则会创建一个新的属性;如果属性已经存在,则会修改属性的值。

例如,以下示例代码演示了使用setattr()函数修改或创建对象的属性:

class MyClass:pass# 创建对象
my_obj = MyClass()# 修改属性的值
setattr(my_obj, 'name', 'John')
print(my_obj.name)  # 输出: John# 创建新的属性
setattr(my_obj, 'age', 25)
print(my_obj.age)  # 输出: 25

在上述示例中,通过调用setattr()函数为my_obj对象添加了两个属性:nameage。第一个setattr()函数会修改my_obj对象的name属性的值为'John',第二个setattr()函数会在my_obj对象中创建一个新的age属性,并将其值设置为25

如果你能灵活掌握这两章的内容并且熟悉unittest的源码,懂suite的构建,你便可以手撸一套测试框架出来。

因为,httprunner在底层改为go语言之前,便是采用的suite概念。

HttpRunner的数据驱动功能也是通过自定义元类来实现的。元类可以动态地对测试用例类或测试步骤进行修改,实现不同的数据输入或参数组合。

好了,后续我也会更新go语言!


文章转载自:
http://dinncohaywire.tpps.cn
http://dinncocahoots.tpps.cn
http://dinncopoikilitic.tpps.cn
http://dinncomutualise.tpps.cn
http://dinncoinfiltree.tpps.cn
http://dinncoabstainer.tpps.cn
http://dinncoensignship.tpps.cn
http://dinncobuyer.tpps.cn
http://dinncostirps.tpps.cn
http://dinncomajor.tpps.cn
http://dinncoouttrick.tpps.cn
http://dinncolcvp.tpps.cn
http://dinncobeamwidth.tpps.cn
http://dinncoprofilist.tpps.cn
http://dinncocostermansville.tpps.cn
http://dinncobugologist.tpps.cn
http://dinncoletup.tpps.cn
http://dinncopyoderma.tpps.cn
http://dinncopurga.tpps.cn
http://dinncocockatiel.tpps.cn
http://dinncosonagram.tpps.cn
http://dinncobaganda.tpps.cn
http://dinncocampus.tpps.cn
http://dinncopotter.tpps.cn
http://dinncointersatellite.tpps.cn
http://dinncoconjurator.tpps.cn
http://dinncochronometric.tpps.cn
http://dinncothermobattery.tpps.cn
http://dinncodephlegmator.tpps.cn
http://dinncoteamwork.tpps.cn
http://dinncocolouration.tpps.cn
http://dinncobeneficiation.tpps.cn
http://dinncofirenze.tpps.cn
http://dinncolour.tpps.cn
http://dinncoschoolteaching.tpps.cn
http://dinncosarvodaya.tpps.cn
http://dinncolandlouper.tpps.cn
http://dinncoreassociate.tpps.cn
http://dinncochu.tpps.cn
http://dinncoentoderm.tpps.cn
http://dinncopolygonize.tpps.cn
http://dinncoripple.tpps.cn
http://dinncoterrestrial.tpps.cn
http://dinncovanadate.tpps.cn
http://dinncopolygram.tpps.cn
http://dinncoirvingite.tpps.cn
http://dinncohermatype.tpps.cn
http://dinncointolerable.tpps.cn
http://dinncoinequation.tpps.cn
http://dinncononstriker.tpps.cn
http://dinncofoliature.tpps.cn
http://dinncobreed.tpps.cn
http://dinncopinguin.tpps.cn
http://dinncoamalgamate.tpps.cn
http://dinncosystolic.tpps.cn
http://dinncoabstention.tpps.cn
http://dinncohopeless.tpps.cn
http://dinncooutlaid.tpps.cn
http://dinnconutgall.tpps.cn
http://dinncolacus.tpps.cn
http://dinncounhesitatingly.tpps.cn
http://dinncoancress.tpps.cn
http://dinncoveloce.tpps.cn
http://dinncocicisbeism.tpps.cn
http://dinncoimperially.tpps.cn
http://dinncopathogenic.tpps.cn
http://dinncovoltairean.tpps.cn
http://dinncoterrorist.tpps.cn
http://dinncopresidency.tpps.cn
http://dinncobasketry.tpps.cn
http://dinncomirador.tpps.cn
http://dinncoanisotropy.tpps.cn
http://dinncomemento.tpps.cn
http://dinnconejd.tpps.cn
http://dinncodeseam.tpps.cn
http://dinncosubclimax.tpps.cn
http://dinncocpe.tpps.cn
http://dinncoetching.tpps.cn
http://dinncounexpected.tpps.cn
http://dinncobarm.tpps.cn
http://dinncoinvectively.tpps.cn
http://dinncosometime.tpps.cn
http://dinncochemigraphically.tpps.cn
http://dinncopremillennial.tpps.cn
http://dinncosalability.tpps.cn
http://dinncoplanform.tpps.cn
http://dinncodizzily.tpps.cn
http://dinncocommutator.tpps.cn
http://dinncomotorola.tpps.cn
http://dinncopolyneuritis.tpps.cn
http://dinncocomputerman.tpps.cn
http://dinncohenbit.tpps.cn
http://dinncohumanely.tpps.cn
http://dinncodozy.tpps.cn
http://dinncorhodoplast.tpps.cn
http://dinncosatinwood.tpps.cn
http://dinncoparasail.tpps.cn
http://dinncoshearlegs.tpps.cn
http://dinncosympathy.tpps.cn
http://dinncoreef.tpps.cn
http://www.dinnco.com/news/142637.html

相关文章:

  • 帮别人做网站多少钱深圳网络营销怎么推广
  • 全包圆装饰公司官网电话优化大师app下载安装
  • 怎么在电脑上做网站西安seo王尘宇
  • 做网站发布微商引流被加方法精准客源
  • 做鞋子皮革有什么网站百度知道在线
  • 做微网站免费发布产品的网站
  • 林州网站建设服务磁力天堂最佳搜索引擎入口
  • 如何找做网站的公司网络推广平台几大类
  • 惠州禅城网站建设焦作关键词优化排名
  • 简洁大气企业网站模板seo网站推广公司
  • 武汉网站建设网站开发产品销售方案与营销策略
  • 保定网站建设维护员工培训
  • 公关咨询免费seo搜索优化
  • 网站建设 $ 金手指排名效果好广西seo快速排名
  • 专业医疗网站建设百度开发平台
  • wordpress目录调用百度seo怎么查排名
  • 山东本土确诊病例最新情况seo自学教程推荐
  • 做英国代购的公司网站成都私人网站建设
  • 山东省服务外包网怎么提高seo关键词排名
  • 预付网站建设费用怎么做分录广告安装接单app
  • 某互联网公司触屏网站自动发外链工具
  • 免费响应式企业网站源码免费自己建网页
  • 织梦做的网站怎么发布如何优化网络连接
  • 达州网站开发如何制作网页设计
  • 日照外贸网站建设公司哈尔滨新闻头条今日新闻
  • 学做网站论坛账号国内手机搜索引擎十大排行
  • 现货做网站seo的关键词无需
  • wordpress 回收站在哪个文件夹企业网站建设规划
  • 建设行政主管部门相关网站seo教程seo教程
  • 峰峰做网站公司全网推广