通过代码实例解析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和php通信乱码问题解决方法
Apr 15 Python
Python深入学习之内存管理
Aug 31 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 Python
Python实现的简单dns查询功能示例
May 24 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
Python 多线程不加锁分块读取文件的方法
Dec 11 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
python3利用Socket实现通信的方法示例
May 06 Python
python requests使用socks5的例子
Jul 25 Python
python集合常见运算案例解析
Oct 17 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 mail()函数使用及配置方法
2014/01/14 PHP
微信自定义分享php代码分析
2016/11/24 PHP
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
javascript打印输出json实例
2013/11/11 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
PHP守护进程实例
2015/03/06 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
Python实现多线程抓取妹子图
2015/08/08 Python
Python+django实现简单的文件上传
2016/08/17 Python
Python中字典和集合学习小结
2017/07/07 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
升职自荐信
2013/11/28 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
大学生入党思想汇报
2014/01/14 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
交通事故调解协议书
2015/05/20 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书