通过代码实例解析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 cookielib 登录人人网的实现代码
Dec 19 Python
Python中条件判断语句的简单使用方法
Aug 21 Python
实例解析Python设计模式编程之桥接模式的运用
Mar 02 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
python绘制热力图heatmap
Mar 23 Python
Python小进度条显示代码
Mar 05 Python
matplotlib实现区域颜色填充
Mar 18 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
Python提取PDF指定内容并生成新文件
Jun 09 Python
Pygame Draw绘图函数的具体使用
Nov 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获取网站域名和地址的代码
2008/08/17 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
js实现三角形粒子运动
2020/09/22 Javascript
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
python用Configobj模块读取配置文件
2020/09/26 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
大学生简单自荐信
2013/11/10 职场文书
门卫岗位职责
2013/11/15 职场文书
经销商培训邀请函
2014/01/21 职场文书
优秀广告词大全
2014/03/19 职场文书
求职信的正确写法
2014/07/10 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
python常见的占位符总结及用法
2021/07/02 Python
基于Go语言构建RESTful API服务
2021/07/25 Golang