通过代码实例解析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字符串和文件操作常用函数分析
Apr 08 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
Python+django实现简单的文件上传
Aug 17 Python
python 批量修改/替换数据的实例
Jul 25 Python
Python多线程原理与用法实例剖析
Jan 22 Python
Python字典的核心底层原理讲解
Jan 24 Python
Python一行代码实现快速排序的方法
Apr 30 Python
set在python里的含义和用法
Jun 24 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
python函数定义和调用过程详解
Feb 09 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 25 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 pack与unpack 摸板字符字符含义
2009/10/29 PHP
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
php自定义session示例分享
2014/04/22 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
Laravel框架表单验证详解
2014/09/04 PHP
phalcon框架使用指南
2016/02/23 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
JavaScript加强之自定义callback示例
2013/09/21 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
Python线性拟合实现函数与用法示例
2018/12/13 Python
python logging 日志的级别调整方式
2020/02/21 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
python中time包实例详解
2021/02/02 Python
pandas按条件筛选数据的实现
2021/02/20 Python
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
售后专员岗位职责
2013/12/08 职场文书
卫生安全检查制度
2014/02/04 职场文书
学生请假条
2014/04/11 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
学前教育专业求职信
2014/09/02 职场文书
微观世界观后感
2015/06/10 职场文书
离职证明范本
2015/06/12 职场文书
车间安全生产管理制度
2015/08/06 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android
MySQL 如何限制一张表的记录数
2021/09/14 MySQL
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS