Откат транзакции sqlalchemy с приспособлением pytest не работаетPython

Программы на Python
Ответить
Anonymous
 Откат транзакции sqlalchemy с приспособлением pytest не работает

Сообщение Anonymous »

Я пишу функциональные тесты с помощью pytest. Я намерен откатывать транзакции после каждого теста, чтобы работать с одними и теми же данными в каждом тесте. Вот мой код:

Код: Выделить всё

@pytest.fixture(scope='function', autouse=True)
def session(db, request):
connection = db.engine.connect()
transaction = connection.begin()

options = dict(bind=connection, binds={}, autoflush=False, autocommit=True)

db.session = db.create_scoped_session(options=options)

def teardown():
transaction.rollback()
connection.close()
db.session.rollback()
db.session.remove()
request.addfinalizer(teardown)

yield db.session
Но это не работает. Некоторые тесты завершаются неудачей, потому что что-то перед ними было изменено (и не было откатано). И некоторые тесты завершаются с этими ошибками:

Код: Выделить всё

FAILED ... - sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
FAILED ... - sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (r...
FAILED ... - sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (raised...
FAILED ... - sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (raised as a ...
FAILED ... - AssertionError: assert [{'id': 1, 'l...'Test'}, ...}] == [{'id': 1, 'l...'Test'}, ...}]
FAILED ... - AssertionError: assert 'updated-diagram' == 'test_1'
ERROR ... - sqlalchemy.exc.InvalidRequestError: No transaction is begun.
Мои комментарии:
  • ... рассмотрите возможность использования блока session.no_autoflush... - в параметрах сеанса есть autoflush=False
  • ... Чтобы начать новую транзакцию с этим сеансом, сначала выполните Session.rollback()... - у меня это также есть при демонтаже
  • AssertionError - оба из них из-за неправильного отката
  • sqlalchemy.exc.InvalidRequestError: Транзакция не начата. - понятия не имею, что и почему здесь произошло


Подробнее: https://stackoverflow.com/questions/714 ... oesnt-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»