通过代码实例解析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 相关文章推荐
django之常用命令详解
Jun 30 Python
TensorFlow如何实现反向传播
Feb 06 Python
DataFrame中去除指定列为空的行方法
Apr 08 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
python实现QQ空间自动点赞功能
Apr 09 Python
如何更优雅地写python代码
Jul 02 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
Django实现列表页商品数据返回教程
Apr 03 Python
利用python查看数组中的所有元素是否相同
Jan 08 Python
python在协程中增加任务实例操作
Feb 28 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
php时区转换转换函数
2014/01/07 PHP
实现PHP多线程异步请求的3种方法
2014/01/17 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
js实现单击图片放大图片的方法
2015/02/17 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
Django框架使用mysql视图操作示例
2019/05/15 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
卡西欧B级产品官方网站:Casio Outlet
2018/05/22 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
求职信写作要突出重点
2014/01/01 职场文书
优秀求职信范文分享
2014/01/26 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
《鱼游到了纸上》教学反思
2014/02/20 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
庆元旦活动总结
2014/07/09 职场文书
技术员岗位职责范本
2015/04/11 职场文书
周一给客户的问候语
2015/11/10 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书
详解Python中的进程和线程
2021/06/23 Python
 Python 中 logging 模块使用详情
2022/03/03 Python