通过代码实例解析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 正则式 概述及常用字符
May 07 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
python实现批量修改文件名代码
Sep 10 Python
Python中super函数的用法
Nov 17 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
python实现关闭第三方窗口的方法
Jun 28 Python
python线程中的同步问题及解决方法
Aug 29 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
python自动点赞功能的实现思路
Feb 26 Python
Python使用socket模块实现简单tcp通信
Aug 18 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下MYSQL limit的优化
2008/01/10 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
Jquery中对数组的操作代码
2011/08/12 Javascript
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
JavaScript基础进阶之数组方法总结(推荐)
2017/09/04 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
JS代码优化的8点建议
2020/02/04 Javascript
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python语音识别实践之百度语音API
2018/08/30 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
python获取linux系统信息的三种方法
2020/10/14 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
将一个文本文件的内容按倒序打印出来
2015/01/05 面试题
房屋转让协议书范本
2014/04/11 职场文书
一年级学生评语
2014/04/23 职场文书
营销团队口号
2014/06/06 职场文书
Python实现自动玩连连看的脚本分享
2022/04/04 Python