通过代码实例解析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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
一文总结学习Python的14张思维导图
Oct 17 Python
Python语言进阶知识点总结
May 28 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
python中pygame安装过程(超级详细)
Aug 04 Python
django自带调试服务器的使用详解
Aug 29 Python
基于python中__add__函数的用法
Nov 25 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
学python最电脑配置有要求么
Jul 05 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 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无限级栏目分类读取的实现代码
2014/02/19 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
php给数组赋值的实例方法
2019/09/26 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
扩展String功能方法
2006/09/22 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
初始Nodejs
2014/11/08 NodeJs
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
JavaScript中的数值范围介绍
2014/12/29 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
Python作用域用法实例详解
2016/03/15 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
python3 线性回归验证方法
2019/07/09 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
python 实现汉诺塔游戏
2020/11/28 Python
中国电视购物:快乐购
2017/02/04 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
实习护士自我鉴定
2013/10/13 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
卫生安全检查制度
2014/02/04 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
个人党性分析总结
2015/03/05 职场文书