通过代码实例解析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实现冒泡,插入,选择排序简单实例
Aug 18 Python
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
python开启多个子进程并行运行的方法
Apr 18 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
Mar 23 Python
通用的Django注册功能模块实现方法
Feb 05 Python
Python中tkinter的用户登录管理的实现
Apr 22 Python
提取视频中的音频 Python只需要三行代码!
May 10 Python
python析构函数用法及注意事项
Jun 22 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
PHP实现适用于自定义的验证码类
2016/06/15 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
简述php环境搭建与配置
2016/12/05 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
js实现进度条的方法
2015/02/13 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
Python实现子类调用父类的方法
2014/11/10 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
浅析Python中signal包的使用
2015/11/13 Python
深入理解Python变量与常量
2016/06/02 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Python登录注册验证功能实现
2018/06/18 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
酒店人事专员岗位职责
2013/12/19 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
会计自我鉴定
2014/02/04 职场文书
法律七进实施方案
2014/03/15 职场文书
学校评语大全
2014/05/06 职场文书
法学院毕业生求职信
2014/06/25 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
python 破解加密zip文件的密码
2021/04/22 Python