通过代码实例解析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命令行参数解析模块getopt使用实例
Apr 13 Python
Python实现的栈(Stack)
Jan 26 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
python 实现多线程下载视频的代码
Nov 15 Python
opencv设置采集视频分辨率方式
Dec 10 Python
python如何查看安装了的模块
Jun 23 Python
python爬虫中采集中遇到的问题整理
Nov 27 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
如何提高python 中for循环的效率
2020/04/15 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
优秀的教师个人的中文求职信
2013/09/21 职场文书
前台文员岗位职责
2013/12/28 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android