通过代码实例解析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 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
Python创建文件和追加文件内容实例
Oct 21 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
django 在原有表格添加或删除字段的实例
May 27 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
Django中提示消息messages的设置方式
Nov 15 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
python 利用toapi库自动生成api
Oct 19 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 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
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
JS中‘hello’与new String(‘hello’)引出的问题详解
2018/08/14 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
什么是Smart Navigation?
2016/07/03 面试题
C# Debug和Testing相关面试题
2015/10/25 面试题
简述安装Slackware Linux系统的过程
2012/05/08 面试题
卫生安全检查制度
2014/02/04 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
企业年度评优方案
2014/06/02 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
违章停车检讨书
2014/10/21 职场文书
经典祝酒词大全
2015/08/12 职场文书
python​格式化字符串
2022/04/20 Python