1. 程式人生 > >【開發也是好測試】(三)—pytest fixture scope

【開發也是好測試】(三)—pytest 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,如下表所示

cases session module function
test_one test_one_two.py test_one
test_two test_one_two.py test_two
test_three test_three_four.py test_three
test_four test_three_four.py test_four

test_one執行時,session開始,test_one_two.py這個module開始,test_one function開始,test_two執行完成時,function和module範圍結束,而直到test_four執行結束時,session才結束。