AYa*_*AYa 6 python fixtures pytest
我有一个夹具返回某种类型的对象,我在另一个文件中定义了另一个夹具,它基本上使用该对象来做其他事情。但是我无法从我的第一个装置中返回对象。
file-1
def fixture_1(s, **kwargs):
def hook(s, **kwargs):
p_b = s.get()
p = p_b.build()
yield p
return hook
Run Code Online (Sandbox Code Playgroud)
file-2 conftest.py
@pytest.fixture(scope='module')
def fixture_1(s, **kwargs):
def hook(s, **kwargs):
#Default implementation is no-op.
pass
return hook
@pytest.fixture(scope='module')
def fixture_2(s,b_p):
some_p = fixture_1(s)
current_status = s.start(some_p)
print(current_status)
yield current_status
Run Code Online (Sandbox Code Playgroud)
我想基本上检索p返回的对象file-1 fixture_1并在file-2 fixture_2夹具中使用它。
包含简单示例
Py.test 支持直接开箱即用的夹具调用其他夹具
将固定装置放在 conftest.py 或测试文件中:
conftest.py:
@pytest.fixture(scope="session")
def fixture_A():
some_obj = create_obj()
return some_obj # or use yield some_obj in case you want to destruct
@pytest.fixture(scope="session")
def fixture_B(fixture_A):
this_is_some_obj = fixture_A
# do something
another = {}
return this_is_some_obj, another
Run Code Online (Sandbox Code Playgroud)
测试示例.py:
@pytest.fixture(scope="session")
def fixture_C(fixture_B):
return fixtureB
def test_finally_the_test(fixture_C):
some_obj, another = fixture_C
Run Code Online (Sandbox Code Playgroud)
值得一提的是,上面的固定装置将被调用一次(即使多个测试使用这些固定装置) - 这是由于每个固定装置的“会话”范围,就像这些固定装置是单例一样(如果与 OOP 相比)
另一个注意事项 pytest 知道运行装置的顺序(它检查依赖关系 - 所以这里没有什么特别要做的)
您似乎使用了错误的 pytest 装置(查看您的参数名称)。
我建议您浏览https://docs.pytest.org/en/latest/fixture.html
您的问题有两种解决方案:
###
# file_1
def not_really_a_fixture(s, **kwargs): # just some hook generator
def hook(s, **kwargs):
p_b = s.get()
p = p_b.build()
yield p
return hook
###
# conftest.py
from file_1 import not_really_a_fixture
@pytest.fixture(scope='module')
def fixture_2(s,b_p): # s and b_p should be names of fixtures that need to run before this
some_p = not_really_a_fixture(s)
current_status = s.start(some_p)
print(current_status)
yield current_status
Run Code Online (Sandbox Code Playgroud)
和:
###
# file_1
@pytest.fixture(scope='module')
def fixture_1(s): # s is name of another fixture
# there is no point in having **kwargs as arg in pytest fixture
def hook(s, **kwargs):
#Default implementation is no-op.
pass
return hook
###
# conftest.py
from file_1 import fixture_1
@pytest.fixture(scope='module')
def fixture_2(s,b_p,fixture_1): # s and b_p should be names of fixtures that need to run before this
# in fixture_1 is value returned by fixture_1, that means your hook func
current_status = s.start(fixture_1)
print(current_status)
yield current_status
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5596 次 |
| 最近记录: |