3. hook函数中的 hookwrapper回到插件代码本身 , 也用到了一个参数hookwrapper=True
。
文章插图
默认情况下,我们之间重写hook函数来彻底改变它要做的事情 , 就像插件代码里第一个hook函数
pytest_sessionstart
一样 。当
hookwrapper=True
时,等于是我们实现了一个hook函数的包装器 。钩子包装器是一个生成器函数,它只产生一次 。当 pytest 调用钩子时 , 首先执行钩子包装器,并像常规钩子一样传递相同的参数 。
yield
关键字大家都熟悉了 , 当代码执行到这里的时候会暂停一下,继续执行下一个钩子,并且会把所有的结果或者异常封装成一个result
对象返回到yield
这里 。钩子包装器本身并不返回结果,只是在实际的钩子实现的外面做一些其他的事情 。
我们的插件功能其实也并不是要修改这个钩子本身测试报告的内容,所以就直接通过
hookwrapper=True
将我们的pytest_runtest_makereport
写成一个包装好的钩子 。接下来就是具体功能的代码,判断当用例测试结果是
fail
,就写到本地文件中 。运行运行一下测试用例,看下我们插件的执行情况 。
文章插图
查看下
failures.txt
内容,结果正确 。文章插图
四、钩子函数排序/调用示例存在这样的情况,对于同一个钩子规范,可能会存在多个实现 。这种情况下可以使用参数
tryfirst
和trylast
来影响钩子的调用顺序 。# Plugin 1@pytest.hookimpl(tryfirst=True)def pytest_collection_modifyitems(items):# 尽可能早的执行...# Plugin 2@pytest.hookimpl(trylast=True)def pytest_collection_modifyitems(items):# 尽可能晚的执行...# Plugin 3@pytest.hookimpl(hookwrapper=True)def pytest_collection_modifyitems(items):# 会在上面的 tryfirst 之前执行outcome = yield# 在执行所有非钩子包装器之后执行
具体执行顺序如下:Plugin3
的pytest_collection_modifyitems
一直调用到yield
,因为它是一个钩子包装器 。Plugin1
的pytest_collection_modifyitems
被调用 , 因为它被标记为tryfirst=True
。Plugin2
的pytest_collection_modifyitems
被调用,因为它被标记为trylast=True
(但即使没有这个标记,它也会在Plugin1之后) 。Plugin3
的pytest_collection_modifyitems
继续在yield
执行代码,yield
接收一个Result
实例 。
最后,闻道有先后,文章有遗漏,欢迎交流 。
【钩子 【pytest官方文档】解读-插件开发之hooks 函数】
推荐阅读
- 五 微软出品自动化神器【Playwright+Java】系列 之常见点击事件操作
- 爱国者手机u盘怎么用(爱国者的u盘使用方法)
- 手机,应如何正确使用(关于手机的正确用法)
- Object Detection 【YOLOv5】LabVIEW+YOLOv5快速实现实时物体识别含源码
- 不会游泳的人如何自学游泳(一般人如何学习游泳)
- 怎样在大海中游泳(在大海中怎么游泳)
- Java一次返回中国所有省市区三级树形级联+前端vue展示【200ms内】
- 翻转吧剧情大战牛魔王怎么过
- 奶茶店的冰块怎么做(奶茶店的碎冰怎么做)
- Go_gin权限验证