#python #postgresql #sqlalchemy #locking #pytest
Вопрос:
Я пишу веб-приложение, которое использует SQLAlchemy и Postgres, и для ограничения одновременного доступа к некоторым данным я использую блокировки ( pg_advisory_xact_lock
). Давайте предположим, что у меня есть такой код
def func():
obtain_lock()
try:
data = ['abc', 123] # 1
if data in DB:
raise Exception('Data is already in DB')
insert_data()
# lock is released automatically
Чтобы убедиться, что замки работают правильно, я:
- запустите два идентичных сеанса отладки с точками останова в строке (1)
- смотрите, чтобы один сеанс достиг точки останова, а другой зависал без удара
- продолжите первый сеанс, убедитесь, что все работает правильно, отпустите блокировку
- точка останова во втором сеансе достигнута, проверьте, что возникло исключение
Возможно ли воспроизвести такое поведение в Pytest, чтобы иметь что-то подобное?
# code.py
def func():
obtain_lock()
set_breakpoint()
try:
data = ['abc', 123] # 1
if data in DB:
raise Exception('Data is already in DB')
insert_data()
# lock is released automatically
# test.py
def test():
t1 = Thread(target=func)
t2 = Thread(target=func)
t1.start()
t2.start()
assert t1.breakpoint.hit and not t2.breakpoint.hit
t1.breakpoint.resume()
assert data in DB
assert t2.breakpoint.hit
with pytest.raises(Exception):
t2.breakpoint.resume()
Или, может быть, есть какой-то другой способ автоматизировать тестирование этих блокировок?