通过代码实例解析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 相关文章推荐
python3.3实现乘法表示例
Feb 07 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Python解析json代码实例解析
Nov 25 Python
python爬虫请求头的使用
Dec 01 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
Dec 03 Python
python识别围棋定位棋盘位置
Jul 26 Python
Python 数据可视化之Bokeh详解
Nov 02 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/10/01 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
PHP之数组学习
2011/05/29 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
js分页工具实例
2015/01/28 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
Python如何调用外部系统命令
2019/08/07 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
Django的CVB实例详解
2020/02/10 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
Pandas之缺失数据的实现
2021/01/06 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
酒吧创业计划书
2014/01/18 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
导游词之日本富士山
2020/01/06 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers