如何让两个发行的灯具相互依赖?

时间:2016-03-19 10:44:56

标签: python unit-testing pytest fixtures

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

有更好的方法吗?

4 个答案:

答案 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

...因此在所有三个位置中绝对是同一对象。像这样的嵌套固定装置对我来说“行之有效”,因此我要么错过了您所问的问题的要点,要么行为发生了变化,或者……其他。但是我想把它留给其他想像这样的嵌套/依赖夹具的人使用。