pytest运行流程

摘要:
pytest的整个测试分为以下六个阶段:pytest_ configure plug-in和conftest py文件配置初始化并创建会话。pytest_ runtest_ Teardow:在pytest_运行测试_调用执行后调用pytest_ fixture_设置:执行fixture的设置过程pytest_ fixture_ post_ Finalizer:执行fixure的拆卸过程(如果有)。

pytest的整个测试分成如下6个阶段:

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退出之前的阶段。

 

 

免责声明:文章转载自《pytest运行流程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇unity制作简单血条qmake的使用(可设置c编译器flag参数)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

django项目同一用户不能同时登陆

1、session认证 ..... login(request, user) #登录成功 # 登录之后获取获取最新的session_key session_key = request.session.session_key # 删除非当前用户session_key的记录 for session in Session.objects.filter(~Q(se...

详解Session分布式共享(.NET CORE版)

一、前言&回顾        在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的Session方案与微软Session方案相比,有什么优势呢?Cookie也可以取代Session的,采用Redis的Session方案优势在哪...

golang mgo的mongo连接池设置:必须手动加上maxPoolSize

本司礼物系统使用了golang的 mongo库 mgo,中间踩了一些坑,总结下避免大家再踩坑 golang的mgo库说明里是说明了开启连接复用的,但观察实验发现,这并没有根本实现连接的控制,连接复用仅在有空闲连接时生效,高并发时无可用连接会不断创建新连接,所以最终还是需要程序员自行去限制最大连接才行。 废话不多说,开始上代码 GlobalMgoSessi...

Flask之Sqlalchemy

Sqlalchemy 开发文档:https://www.jianshu.com/p/0ad18fdd7eed 创建数据库 安装 pip instal flask-sqlalchemy 两种配置方法 # 两种配置数据库方法 第一种app.config from flask import Flask import pymysql from flask_sq...

会话、服务器ASP.NET中Session的用法by小雨

在写这篇文章之前,xxx已经写过了几篇关于改会话、服务器-主题的文章,想要了解的朋友可以去翻一下之前的文章 我们可以应用 Session 象对存储特定的用户会话所需的息信。当用户在应用程序的页之间跳转时,存储在 Session 象对中的量变不会除清,而用户在应用程序中拜访页面时,这些量变终始存在。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话...

IOS 蓝牙(GameKit、Core Bluetooth)

GameKit的蓝牙开发注意 ● 只能用于iOS设备之间的连接● 只能用于同一个应用程序之间的连接 ● 最好别利用蓝牙发送比较大的数据/*关于蓝牙的数据传输1. 一次性传送,没有中间方法,所谓中间方法值得是,传输进度比例对于用户而言,选择了传输,就需要等待传输完成,或者传输以失败告终这就意味着,在实际开发过程中,最好不要用蓝牙传输太大的文件在实际应用...