【开发也是好测试】(三)—pytest fixture scope

本文归纳总结了pytest fixture的session、module、class和function四种不同scope的含义,并通过代码实例进行说明,阐述了在测试执行过程中的作用域生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读

  本文在http://pythontesting.net/framework/pytest/pytest-session-scoped-fixtures/ 文章的基础上,归纳总结fixture的不同scope的区别。

不同scope含义

  • session
  • module
  • class
  • function
Scope
session在一次Run或Debug中执行的所有case共享一个session,第一个case开始执行的时候session开始,最后一个case执行结束的时候session结束,这些case可能分布在不同的class或module中。
module一个.py文件可以看作一个module,其表示的范围指该文件中第一个case到最后一个case之间的范围
class表示的范围即class的范围
function表示的范围即function的范围

代码说明

(借用了参考文章中的代码)

conftest.py:

import pytest

@pytest.fixture(scope="session")
def resource_a(request):
    print('In resource_a()')

    def resource_a_fin():
            print('\nIn resource_a_fin()')
    request.addfinalizer(resource_a_fin)

@pytest.fixture(scope="module")
def resource_b(request, resource_a):
    print('In resource_b()')

    def resource_b_fin():
            print('\nIn resource_b_fin()')
    request.addfinalizer(resource_b_fin)

@pytest.fixture(scope="function")
def resource_c(request, resource_b):
    print('In resource_c()')

    def resource_c_fin():
            print('\nIn resource_c_fin()')
    request.addfinalizer(resource_c_fin)


# these are just some fun dividiers to make the output pretty
# completely unnecessary, I was just playing with autouse fixtures
@pytest.fixture(scope="function", autouse=True)
def divider_function(request):
    print('\n        --- function %s() start ---' % request.function.__name__)
    def fin():
            print('        --- function %s() done ---' % request.function.__name__)
    request.addfinalizer(fin)

@pytest.fixture(scope="module", autouse=True)
def divider_module(request):
    print('\n    ------- module %s start ---------' % request.module.__name__)
    def fin():
            print('    ------- module %s done ---------' % request.module.__name__)
    request.addfinalizer(fin)

@pytest.fixture(scope="session", autouse=True)
def divider_session(request):
    print('\n----------- session start ---------------')
    def fin():
            print('----------- session done ---------------')
    request.addfinalizer(fin)

test_one_two.py:

def test_one(resource_c):
    print('In test_one()')

def test_two(resource_c):
    print('\nIn test_two()')

test_three_four.py:

def test_three(resource_c):
    print('\nIn test_three()')

def test_four(resource_c):
    print('\nIn test_four()')

output:

$ py.test -s -v
==================================== test session starts ====================================
platform darwin -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- /usr/bin/python
collected 4 items 

test_one_two.py:1: test_one 
----------- session start ---------------

    ------- module test_one_two start ---------

        --- function test_one() start ---
In resource_a()
In resource_b()
In resource_c()
In test_one()
PASSED
In resource_c_fin()
        --- function test_one() done ---

test_one_two.py:4: test_two 
        --- function test_two() start ---
In resource_c()

In test_two()
PASSED
In resource_c_fin()
        --- function test_two() done ---

In resource_b_fin()
    ------- module test_one_two done ---------

test_three_four.py:1: test_three 
    ------- module test_three_four start ---------

        --- function test_three() start ---
In resource_b()
In resource_c()

In test_three()
PASSED
In resource_c_fin()
        --- function test_three() done ---

test_three_four.py:4: test_four 
        --- function test_four() start ---
In resource_c()

In test_four()
PASSED
In resource_c_fin()
        --- function test_four() done ---

In resource_b_fin()
    ------- module test_three_four done ---------

In resource_a_fin()
----------- session done ---------------


================================= 4 passed in 0.02 seconds ==================================

在这次执行中一种有4个case,属于同一个session,两个module,4个function,如下表所示

casessessionmodulefunction
test_onetest_one_two.pytest_one
test_twotest_one_two.pytest_two
test_threetest_three_four.pytest_three
test_fourtest_three_four.pytest_four

test_one执行时,session开始,test_one_two.py这个module开始,test_one function开始,test_two执行完成时,function和module范围结束,而直到test_four执行结束时,session才结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值