版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010924834/article/details/77840302
导读
本文在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,如下表所示
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才结束。