通过代码实例解析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与遗留的数据库整合的方法指南
Jul 24 Python
使用Python脚本生成随机IP的简单方法
Jul 30 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
python批量读取txt文件为DataFrame的方法
Apr 03 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
Python实现求两个数组交集的方法示例
Feb 23 Python
Python+OpenCV采集本地摄像头的视频
Apr 25 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
Mar 11 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
pandas apply多线程实现代码
Aug 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水印
2007/03/16 PHP
使用dump函数,给php加断点测试
2013/06/25 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
PHP中的替代语法介绍
2015/01/09 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
利用python画一颗心的方法示例
2017/01/31 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
医学专业毕业生个人的求职信
2013/12/04 职场文书
后勤主管工作职责
2013/12/07 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
Python基础学习之奇异的GUI对话框
2021/05/27 Python
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python