通过代码实例解析Pytest运行流程


Posted in Python onAugust 20, 2020

pytest的整个测试分成如下6个阶段:

1、pytest_configure

插件和conftest.py文件配置初始化等,创建session。

2、pytest_sessionstart

创建session完以后,执行collection之前的阶段。会调用pytest_report_header向terminal打印一些环境信息,比如插件版本,python版本,操作平台这些等。

3、pytest_collection

测试用例收集以及生成测试输入的过程,这里还可能包括根据keywords和marker筛选测试用例的过程。这个过程会涉及多次generate item的调用,主要关注如下调用:

pytest_generate_tests(metafunc): 生成测试项;

pytest_make_parametrize_id(config, val, argname):根据@pytest.mark.parametrize生成对应值;

pytest_collection_modifyitems(session, config, items):所有测试项收集完毕以后调用,一般用来进行重新排序和二次过滤。

pytest_deselected(items): 有测试项被关键字或者marker过滤掉的时候会被调用

注意: 通过::语法筛选测试用例的步骤是在之前生成测试用例阶段完成的,并不是在deselected里面做的

4、pytest_runtestloop

执行筛选过的测试用例, 在pytest_runtest_protocol里面完成包括setup, call, teardown和log打印的过程。主要关注如下调用:

pytest_runtest_logstart(nodeid, location):开始执行一个新测试项的时候调用.

注:官方文档的意思表述的有点模糊,并不是setup/call/teardown阶段分别调用一次,就是函数命令一直的意思测试开始前打印一次

pytest_runtest_logfinish(nodeid, location): 结束执行一个测试项的时候调用.

注:同上

pytest_runtest_setup(item): 在pytest_runtest_call执行之前调用.

pytest_runtest_call(item): 执行实际的测试过程。

pytest_runtest_teardow(item, nextitem): 在pytest_runtest_call执行之后调用

pytest_fixture_setup(fixturedef, request):执行fixture的setup过程(是否执行取决于fixture是否需要创建).

pytest_fixture_post_finalizer(fixturedef, request): 执行fixture的teardown过程(如果有)。

pytest_runtest_makereport(item, call): 返回给定item和call对应的 _pytest.runner.TestReport 对象, 这里的call object我们一般不太接触,_pytest/runner.py里面有具体的用法可以参考。

pytest_runtest_logreport(report): 在测试的setup/call/teardown阶段report更新之后分别被调用到,可以用when属性来区分不同阶段。

pytest_report_teststatus(report, config): 返回各个测试阶段的result, 可以用when属性来区分不同阶段。

5、pytest_sessionfinish

所有测试执行完毕之后,返回exit status之前的阶段。会调用pytest_terminal_summary向terminal打印一些summary信息,比如pass, fail, error数量之类的总结信息。

def pytest_terminal_summary(terminalreporter, exitstatus, config):
  '''收集测试结果'''
  print(terminalreporter.stats)
  print("total:", terminalreporter._numcollected)
  print('passed:', len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown']))
  print('failed:', len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown']))
  print('error:', len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown']))
  print('skipped:', len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown']))
  # terminalreporter._sessionstarttime 会话开始时间
  duration = time.time() - terminalreporter._sessionstarttime
  print('total times:', duration, 'seconds')

6、pytest_unconfigure

session结束以后,整个process退出之前的阶段。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中from module import * 的一个坑
Jul 20 Python
python通过urllib2获取带有中文参数url内容的方法
Mar 13 Python
在Python中使用模块的教程
Apr 27 Python
Python使用Supervisor来管理进程的方法
May 28 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
python PyTorch预训练示例
Feb 11 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
对python中的控制条件、循环和跳出详解
Jun 24 Python
浅析python redis的连接及相关操作
Nov 07 Python
Python中的With语句的使用及原理
Jul 29 Python
详解tensorflow之过拟合问题实战
Nov 01 Python
Python 全局空间和局部空间
Apr 06 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 #Python
python openCV实现摄像头获取人脸图片
Aug 20 #Python
Python实现自动签到脚本功能
Aug 20 #Python
python如何随机生成高强度密码
Aug 19 #Python
python实现图片转换成素描和漫画格式
Aug 19 #Python
python+django+selenium搭建简易自动化测试
Aug 19 #Python
python 中的命名空间,你真的了解吗?
Aug 19 #Python
You might like
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
建站常用13种PHP开源CMS比较
2009/08/23 PHP
php计算税后工资的方法
2015/07/28 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
php实现微信发红包功能
2018/07/13 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
Python中__init__和__new__的区别详解
2014/07/09 Python
Python os模块介绍
2014/11/30 Python
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
Django开发的简易留言板案例详解
2018/12/04 Python
python实现维吉尼亚加密法
2019/03/20 Python
如何定义TensorFlow输入节点
2020/01/23 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
一份报关员的职业规划范文
2014/01/08 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS