Isolieren von py.test-DB-Sitzungen in Flask-SQLAlchemy

Ich versuche, eine Flask-App mit Flask-SQLAlchemy zu erstellen. Ich benutze pytest, um die DB zu testen. Eines der Probleme scheint darin zu liegen, isolierte DB-Sitzungen zwischen verschiedenen Tests zu erstellen.

Ich habe ein minimales, vollständiges Beispiel zusammengestellt, um das Problem hervorzuheben. Beachten Sie, dasstest_user_schema1() undtest_user_schema2() sind gleich

Dateiname:test_db.py

from models import User

def test_user_schema1(session):
    person_name = 'Fran Clan'
    uu = User(name=person_name)
    session.add(uu)
    session.commit()

    assert uu.id==1
    assert uu.name==person_name

def test_user_schema2(session):
    person_name = 'Stan Clan'
    uu = User(name=person_name)
    session.add(uu)
    session.commit()

    assert uu.id==1
    assert uu.name==person_name

Wenn die Datenbank zwischen meinen Tests wirklich isoliert ist, sollten beide Tests bestehen. Der letzte Test schlägt jedoch immer fehl, da ich keine Möglichkeit gefunden habe, ein korrektes Rollback für DB-Sitzungen durchzuführen.

conftest.py verwendet das Folgende basierend auf dem, was ich in @ gesehen haAlex Michaels Blogbeitrag, aber dieser Fixture-Code bricht ab, weil er anscheinend die DB-Sessions zwischen den Fixtures nicht isoliert.

@pytest.yield_fixture(scope='function')
def session(app, db):
    connection = db.engine.connect()
    transaction = connection.begin()

    #options = dict(bind=connection, binds={})
    options = dict(bind=connection)
    session = db.create_scoped_session(options=options)

    yield session

    # Finalize test here
    transaction.rollback()
    connection.close()
    session.remove()

ür die Zwecke dieser Frage habe icha gist, das alles enthält, was Sie brauchen, um es zu reproduzieren; Du kannst es mit @ klongit clone https://gist.github.com/34fa8d274fc4be240933.git.

Ich verwende die folgenden Pakete ...

Flask==0.10.1
Flask-Bootstrap==3.3.0.1
Flask-Migrate==1.3.0
Flask-Moment==0.4.0
Flask-RESTful==0.3.1
Flask-Script==2.0.5
Flask-SQLAlchemy==2.0
Flask-WTF==0.11
itsdangerous==0.24
pytest==2.6.4
Werkzeug==0.10.1
Zwei FragenWarum ist der Status Quo defekt? Das gleiche py.test-Gerät schien für jemand anderen zu funktionieren.Wie kann ich das Problem beheben, damit es richtig funktioniert?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage