了解pytest插件机制、定制思路及hook常用插件清单

举报
泽宇-Li 发表于 2023/07/14 13:31:43 2023/07/14
【摘要】 一、了解hook清单方式、查看、翻译的方式有哪些: 接着上回说的pytest的hook清单是什么?怎么去查看hook清单呢?如何使用hook清单呢?下面小编就为大家来解析下。  hook清单又叫钩子函数,在pytest_的函数当中都是空的,是为了提供了名字、参数、返回值来为插件使用,其实也是hook支持的插件机制,查看hook清单的方法有俩种:    方法一:查看源码  在hookspec....

一、了解hook清单方式、查看、翻译的方式有哪些: 

接着上回说的pytest的hook清单是什么?怎么去查看hook清单呢?如何使用hook清单呢?下面小编就为大家来解析下。

  hook清单又叫钩子函数,在pytest_的函数当中都是空的,是为了提供了名字、参数、返回值来为插件使用,其实也是hook支持的插件机制,查看hook清单的方法有俩种:

    方法一:查看源码  在hookspec.py中可以查看到所有的约定。如图:

           image.png

    方法二:查看pytest官方文档:https://docs.pytest.org/en/7.3.x/reference/referece.html#hooks

          

          文档从介绍pytest-收集测试用例-执行测试用例-断言-报告-调试阶段,来具体分析。

二、查找到的hook清单源码如何翻译及获取?

  源码翻译和上述介绍的方法是对应的,第一种方法介绍的是再软件上查看hook清单可以选择钩子后右键add....输入“翻译下方内容”即可。第二种方法是浏览文档后在文档中进行翻译,右键选中进行翻译即可,直接看到中文内容扫清了学习障碍。看到的hook都是pytest本身,在安装第三方插件后,如果插件提供新的hook内部是无法看到的 需要通过源码的方式去动态获取,看到的hook清单都是pytest 插件的hook并没有体现需要动态获取。

三、如何使用hook有哪些规则?  

   1: 被动的调用:

          比如说在项目中创建conftest.py文件实现hook函数编写,编写测试用例,定义函数并没有执行函数所以print无法打印输出结果是空。可以直接使用pytest会发现函数被调用,是由pytest在执行过程中调用函数才能输出,这就是被动的调用不需要做什么,只需要知道hook名字创建同名函数等待被调用即可。

          代码如下图所示:

         image.png

         image.png 

2:掌握主动

         很多插件可以改变pytest原有的运行过程和运行结果,所以是掌握主动,完全改变运行的流程顺序和结果,比如创建hook后不想按照原有方式执行可以在前面加一个装饰器,@pytest为什么加装饰器呢?实际上按照我们插件的机制规则和系统规则每一个hook都要加一个装饰器,如果用简单的用法可以不加装饰器,高级用法加装饰器,在装饰器中加上参数trelast=true 。如图所示:

         image.png

         如果去掉装饰器就会被调用,说明作为一个钩子来讲能不能被调用自己可以说的算,除了自己可以不被调用之外,还可以修改tryfrist后加一个return “泽宇李真帅”发现框架不被执行。如图所示:

         image.png

        Pytest要不要执行怎么执行执行结果是什么由我自己代码说的算,就是说做什么返回什么,可以说对一些结果的串改,结果的串改是比较粗放的,修改效果也是一点不够高雅或细致,可以做一些酷炫效果,比如:

        新建一个测试用例 test_api,Def  test_apiO: Assert 1==0断言,输入pytest后再文件中找到并执行测试用例,结果是断言失败是因为1不等于0?测试开发的能力是可以深度的控制和改变我们框架的执行过程,上方的用例如何从测试失败变成测试通过再不改变代码的情况下,通过hook方式进行修改,修改是非常的细致化,相对比被动调用是简单的,

       image.png

3:完全控制的方式及步骤:

     首先创建个函数  如图:

         1:添加装饰器 @pytest.hookmpl(hookwrapper=true)以一个包装器的方式来运行

         2:def 函数: print(“用例开始执行”)——前置

         3:yield关键字  outcome=yield 因为是生成器 将结果保存再outcome

         4:print(‘用例执行结束’)——后置 用例执行之后

         5:修改俄式用例 print(“修改测试用例为测试结果为:通过”)

         6:outcome.force_result(1)即可将失败换位passed

     image.png

结果就是,断言1==0 改成了测试通过,根本不关心1还是0 ,根本就是我们改变了框架运行逻辑。

四、断言失败和成果的标准:

  测试通过的1或0都可以 为什么写任何数字都可以,0和1都代码通过呢?什么代表失败呢?从通过改失败是怎么改的呢?标准是怎么定呢?Pytest中,什么是测试通过的标准,什么是测试失败的标准?怎么判定呢? 

  测试失败的标准有三种:

      断言异常就会判定为测试失败

      Setup异常:判断测试出错

      没有异常:判断测试通过

  如何把测试通过的用例修改为测试失败呢?比如说,Assert 1==1 断言测试,如果没有钩子(函数)的话测试是通过的,用钩子来修改为失败这里需要添加断言。比如 assert_false 引发断言异常 被判定为失败,这就是框架里面东西  使用框架的都要掌握 测开和自动化测试都需要掌握。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。