pytest_重写pytest_sessionfinish方法的执行顺序_结合报告生成到发送邮件
背景:
Python + pytest+pytest-testreport生成测试报告,到了生成报告之后,想要发送邮件,之前的方案是配合Jenkins,配置报告的路径进行发送
如果是平时的跑的项目,没有走到Jenkins,就没办法发送邮件,导致有时测试用例跑完之后,没有发送邮件,不清楚执行的情况
鉴于这种情况,做了测试用例执行完成之后,发送邮件的操作
实现的效果:
pytest执行用例执行完成后,通过pytest-testreport生成测试报告后,再调起发送邮件方法,将最新的测试报告发送出去
实现思路:
1、 conftest文件,自定义pytest的参数:sendemail
2、 sendemail方法主要判断参数是否需要发邮件,需要则调用获取当前最新报告的方法,get_new_file
3、 get_new_file:主要通过获取给定文件目录,按照时间进行排序,然后获取最新的文件,最后返回最新文件的路径,将文件提供给发送邮件
4、 执行完成后,获取sendemail的参数值,如果为True,则需要发送邮件
5、 在conftest文件,定义的sendemail方法,其实是重写了pytest的pytest_sessionfinish,这个钩子函数的作用是测试用例执行完成后,再执行的一个方法
6、 由于使用了pytest-testreport,这个插件,也重写了pytest_sessionfinish,如果没有执行这两个同名钩子函数的执行顺序,则会出现,先执行了发送邮件,发送邮件取的是旧的文件,不是当前最新生成的文件,发送邮件的附件和最新的测试结果不匹配
7、 鉴于上面的问题,需要给两个同名的函数,指定执行的顺序,此时要使用@pytest.hookimpl(执行最后执行),即@pytest.hookimpl(trylast=True)
Hookimple执行顺序:
可参考:https://wenku.baidu.com/view/6f2c136be618964bcf84b9d528ea81c758f52ea5.html

这是执⾏的顺序:
1. Plugin3的pytest_collection_modifyitems被调⽤直到注⼊点,因为它是⼀个钩⼦函数装饰器。
2. 调⽤Plugin1的pytest_collection_modifyitems是因为它标有tryfirst=True。
3. 调⽤Plugin2的pytest_collection_modifyitems因为它被标记trylast=True(但即使没有这个标记,它也会在Plugin1之后出现)。
4. 插件3的pytest_collection_modifyitems然后在注⼊点之后执⾏代码。yield接收⼀个Result实例,该实例封装了调⽤⾮装饰器的结
果。包装不得修改结果。
以上使⽤tryfirst,trylast,以及结合hookwrapper=True的⽰例,它会影响彼此之间hookwrappers的排序
具体实现代码:
1、 获取当前测试报告目录下,最新的文件,并获取最新文件的路径

2、 Conftest 文件添加新的执行参数sendemail

def pytest_addoption(parser): # 添加是否发送邮件的配置参数
parser.addoption(
"--sendemail",
action="store",
metavar="sendemail",
default="true",
help="sendemail",
)
3、 Conftest文件重写测试用例执行完成的方法【pytest_sessionfinish】

@pytest.hookimpl(trylast=True)
def pytest_sessionfinish(session):
# 在测试用例执行完成后执行,由于pytesttestreport也有使用此钩子函数,属于要加上执行的顺序trylast=True
email = session.config.getoption('--sendemail')
if email:
file = CommunFun().get_new_file("D:\\xxx\\xxx\\xxx\\reports")
sendEmail().send_email(email_to="xxxx@qq.com", filepath=file)
4、 Pytest-testport报告也使用了【pytest_sessionfinish】,所以要给本地conftest文件的【pytest_sessionfinish】,加上执行的顺序
@pytest.hookimpl(trylast=True)
pytest_重写pytest_sessionfinish方法的执行顺序_结合报告生成到发送邮件的更多相关文章
- C#类中方法的执行顺序
有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下,父类和子类的各种方法的执行顺序到底是什么,下面通过场景的举例来重新认识下方法的执行顺序: (下面内容涉及到了C#中的继承,构造函数 ...
- 在Spring Bean的生命周期中各方法的执行顺序
Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下十种: 通过实现 InitializingBe ...
- jquery和js的几种页面加载函数的方法以及执行顺序
参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html https://www.cnblogs.com/james641/p/783837 ...
- odoo开发笔记 -- 多个子类继承同一个父类方法的执行顺序
场景描述: odoo模块化开发的架构理念,科学&高效, 可以让很多业务场景,尽可能松耦合:让开发人员的主要精力,关注在当前的业务逻辑: 所谓「前人栽树,后人乘凉」,模块整体好比一棵大树, 开发 ...
- Promise.then方法的执行顺序例题分析
1. 当Promise对象作为resolve的参数时 const p = Promise.resolve(); const p1 = Promise.resolve(p); //就是p const p ...
- JS中For循环中嵌套setTimeout()方法的执行顺序
在For循环中执行setTimeOut()方法的代码,执行顺序是怎样的呢? 代码如下 function time() { for(var i= 0;i<5;i++){ setTimeout(fu ...
- js中页面加载完成后执行的几种方法及执行顺序
在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...
- View & Controller 一些方法的执行顺序
一. 加载视图 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UI ...
- Unity3d之MonoBehavior自带方法的执行顺序
首先贴一张图(从其他地方摘录的,不记得出处,如果有小伙伴知道可以评论留言) 看了以后脑子有个大概的概念,可还是一知半解的感觉(接触Unity也有2年之久,却从来没想过弄清楚心中这团迷雾,总是囫囵吞枣用 ...
- Python unittest discover()方法与执行顺序补充
一.discover更多测试用例 可以根据不同的功能创建不同的测试文件,甚至是不同的测试目录,测试文件中还可以将不同的小功能划分为不同的测试类,在类下编写测试用例,让整体结构更加清晰 但通过addTe ...
随机推荐
- visual studio 2008的试用版评估期已结束(附无法使用产品密钥)的解决方法
visual studio 2008过了试用期后再次启动提示对话框:visual studio的试用版评估期已结束. 解决办法: 第一步,在"控制面板"中启动"添加删除程 ...
- 我第一个开源AI小产品-video2blog即将正式发布
前言 首先它是为了解决我自己的个人问题.不管能不能帮到你,或者对于看到的你是否有点利用价值,也没太大的关系,最起码你可以来看看我开发小产品的整个过程. 一段时间以来,我开始通过youtube平台来获取 ...
- LVS负载均衡(3)-- DR模型搭建实例
目录 1. LVS DR模型搭建 1.1 DR模型网络规划 1.2 RS设备的VIP冲突解决方式 1.3 DR模型访问流程 1.4 DR模型配置 1.4.1 ROUTER设备配置 1.4.2 后端ng ...
- HEOI 2024游记
(虽然是体验罢 HEOI2024游记 前 \(\,\,\)省选! \(\,\,\)得知省选可以报名体验的时候着实很兴奋 也是不假思索的就报了 Day 0 本来说是九点上大巴 结果硬生拖到十点半(恼 分 ...
- 关于URP14绘制全屏Blit后处理的改动
最近用回URP,发现RendererFeature这部分改动很大,启用了之前HDRP的RTHandle,RTHandle的设计类似于优化版本的RenderTexture, 可以统一控制缩放或者并非一对 ...
- 解密Prompt系列29. LLM Agent之真实世界海量API解决方案:ToolLLM & AnyTool
很早之前我们就聊过ToolFormer,Gorilla这类API调用的Agent范式,这一章我们针对真实世界中工具调用的以下几个问题,介绍微调(ToolLLM)和prompt(AnyTool)两种方案 ...
- MyBatis反射模块源码分析
说明:本文参考至https://www.jianshu.com/p/baba62bbc107 MyBatis 在进行参数处理.结果映射时等操作时,会涉及大量的反射操作.为了简化这些反射相关操作,MyB ...
- 最小生成树Kruskal算法的实现原理
到底什么是最小生成树 最小生成树算法应用范围比较广,例如在网络的铺设当中难免会出现环路,需要要生成树算法来取出网络中的环,防止网络风暴的发生.那到底什么是最小生成树呢?我这里就不给严谨的定义了,这种定 ...
- Swoole 源码分析之 Http Server 模块
首发原文链接:Swoole 源码分析之 Http Server 模块 Swoole 源码分析之 Http Server 模块 Http 模块的注册初始化 这次我们分析的就是 Swoole 官网的这段代 ...
- 轻松绕过 Graphql 接口爬取有米有数的商品数据
轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql.所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输. ...