通过代码实例解析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中操作mysql的pymysql模块详解
Sep 13 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
python实现感知器
Dec 19 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
Python使用wget实现下载网络文件功能示例
May 31 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 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 SQLite类
2009/05/07 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
javascript控制台详解
2015/06/25 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
详解react-webpack2-热模块替换[HMR]
2017/08/03 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
python统计日志ip访问数的方法
2015/07/06 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
详解Python IO口多路复用
2020/06/17 Python
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
医学院学生的自我评价分享
2013/11/19 职场文书
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
刊首寄语大全
2014/04/11 职场文书
五一活动标语
2014/06/30 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
小学教学工作总结2015
2015/05/13 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技