【開発もいいテストです】(三)—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:
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実行が終わったら、セッションは終わります。
本論文はhttp://pythontesting.net/framework/pytest/pytest-session-scoped-fixtures/ 文章をもとにして、fixtureの異なるscopeの違いをまとめます。
異なるscopeの意味
セッション
一回の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実行が終わったら、セッションは終わります。