在test_something()
中,app
实例应与login
实例使用的实例相同。
@pytest.fixture
def app():
# ...
return app
@pytest.fixture
def login(app):
# ...
return login
def test_something(self, app, login):
pass
我尝试的是从第二个灯具返回两个对象,但我不会称之为惯用语。
@pytest.fixture
def app_and_login(app):
# ...
return app, login
def test_something(self, app_and_login):
app, login = login_and_login
有更好的方法吗?
答案 0 :(得分:2)
正如您所描述的那样,默认情况下,的夹具 共享用于测试的运行时。
这在任何地方都没有明确记录(或者至少我还没有找到它),但它有些含蓄:Sharing a fixture across tests in a module描述了scope
参数,默认范围是function
。
其他范围将是例如be module
(共享/缓存同一模块中所有测试的夹具)或session
(缓存整个测试会话的夹具)。
答案 1 :(得分:0)
我没想到这一点,但它似乎是默认行为。我找不到任何关于此的文档。提示很受欢迎。
答案 2 :(得分:0)
您可以将其作为对象返回,并使用第三个fixtue:
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/seatLegendLayout">
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/linearLayout_gridtableLayout"
android:layout_width="900dp"
android:layout_height="match_parent"
android:orientation="horizontal">
<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="4dp"
android:columnWidth="100dp"
android:gravity="center"
android:numColumns="9"
android:horizontalSpacing="1dp"
android:scrollbarAlwaysDrawHorizontalTrack="true"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:scrollbars="horizontal"
android:stretchMode="none"
android:verticalSpacing="1dp">
</GridView>
</LinearLayout>
</FrameLayout>
</HorizontalScrollView>
答案 3 :(得分:0)
我知道这个问题很老,但是我看不到您描述的行为,因此我被这个问与答所困扰,直到我以为“它不能那样工作。” ”,并为自己进行测试。我尝试过:
platform darwin -- Python 3.7.7, pytest-6.0.1, py-1.9.0, pluggy-0.13.1 -- .../bin/python3
我做了这个测试,它通过了:
import collections
import pytest
AppObject = collections.namedtuple("App", ["name", "login"])
@pytest.fixture
def app():
app = AppObject("appname", "applogin")
return app
@pytest.fixture
def login(app):
return app.login
def test_something(app, login):
assert isinstance(app, AppObject) and app.name == "appname"
assert isinstance(login, str) and login == "applogin"
OP似乎担心app
固定装置接收的login
对象与应用程序固定装置返回的app
不同。我看不到这种情况。例如,如果您添加一些有用的print
语句,例如:
import collections
import pytest
AppObject = collections.namedtuple("App", ["name", "login"])
@pytest.fixture
def app():
app = AppObject("appname", "applogin")
print("Object id in app fixture: %d" % id(app))
return app
@pytest.fixture
def login(app):
print("Object id in login fixture: %d" % id(app))
return app.login
def test_something(app, login):
print("Object id in test: %d" % id(app))
assert isinstance(app, AppObject) and app.name == "appname"
assert isinstance(login, str) and login == "applogin"
我看到以下输出:
Object id in app fixture: 4451368624
Object id in login fixture: 4451368624
Object id in test: 4451368624
...因此在所有三个位置中绝对是同一对象。像这样的嵌套固定装置对我来说“行之有效”,因此我要么错过了您所问的问题的要点,要么行为发生了变化,或者……其他。但是我想把它留给其他想像这样的嵌套/依赖夹具的人使用。