【開発もいいテストです】(三)—pytest fixture scope

8602 ワード

読み解く
本論文はhttp://pythontesting.net/framework/pytest/pytest-session-scoped-fixtures/ 文章をもとにして、fixtureの異なるscopeの違いをまとめます。
異なるscopeの意味
  • セッション
  • module
  • class
  • function
  • Scrope
    セッション
    一回のRunまたはDebugで実行されるすべてのcaseは一つのsessionを共有し、最初のcaseが実行を開始した時にsessionが始まり、最後のcaseが実行が終了した時にsessionが終了し、これらのcaseは異なるclassまたはmoduleに分布する可能性がある。
    module
    一つ.pyファイルはmoduleと見なすことができ、その表現の範囲はこのファイルの最初のcaseから最後のcaseまでの範囲を指す。
    クラス
    表示の範囲はクラスの範囲です。
    機能
    表示の範囲がfunctionの範囲です。
    コード説明
    (参考文のコードを借りました)
    conft.py:
    import pytest
    
    @pytest.fixture(scope="session")
    def resource_a(request):
        print('In resource_a()')
    
        def resource_a_fin():
                print('
    In 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('
    In 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('
    In 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('
    --- 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('
    ------- 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('
    ----------- 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('
    In test_two()'
    )
    test_three_four.py:
    def test_three(resource_c):
        print('
    In test_three()'
    ) def test_four(resource_c): print('
    In test_four()'
    )
    out put:
    $ 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
    セッション
    module
    機能
    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実行時、セッション開始、test_one.two.pyというmoduleが始まり、test_one functionが始まり、test_two実行が完了すると、Fnctionとmoduleの範囲が終了し、test_まで。four実行が終わったら、セッションは終わります。