pytest — возможно ли запустить скрипт / команду между всеми тестовыми сценариями?

#python #pytest #nose

#питон #пытест #нос #python #pytest

Вопрос:

Хорошо, это определенно моя ошибка, но мне нужно ее исправить. Один из моих тестовых сценариев довольно последовательно (но не всегда) обновляет мою базу данных таким образом, что вызывает проблемы у других (в основном, это лишает тестируемого пользователя прав доступа к тестовой базе данных).

Я мог бы легко выяснить, какой скрипт вызывает это, выполнив простой запрос либо после каждого отдельного теста, либо после завершения каждого тестового сценария.

т.е. pytest , или nose2 , сделал бы следующее:

 run test_aaa.py
run check_db_access.py  #ideal if I could induce a crash/abort
run test_bbb.py
run check_db_access.py
...
  

Вы поняли идею. Есть ли встроенная опция или плагин, который я могу использовать? Набор тестов в настоящее время работает как на pytest, так и на nose2, так что любой из вариантов.

Редактировать: это не тестовая база данных или база данных с фиксированной загрузкой. Это снимок любой из множества чрезвычайно сложных действующих баз данных, и набор тестов, согласно его дизайну, должен анализировать базы данных и выяснять, как запускать их тесты (почти весь доступ доступен только для чтения). Это прекрасно работает и имеет много полезных аспектов, по крайней мере, в моем конкретном контексте, но это также означает, что мне не нужно работать с демонтажем или загрузкой оборудования.

Комментарии:

1. Идеальный способ — восстановить тестовую базу данных в функции teardown. Вы можете использовать приспособление автоматического использования на уровне модуля / функции и вызвать свой скрипт в функции демонтажа

2. @Sanju. Хорошее предложение, но я отредактировал свой вопрос, чтобы показать, почему я не могу его использовать.

Ответ №1:

 import pytest

@pytest.fixture(autouse = True)
def wrapper(request):
    print('nbefore: {}'.format(request.node.name))
    yield
    print('nafter: {}'.format(request.node.name))

def test_a():
    assert True

def test_b():
    assert True
  

Пример вывода:

 $ pytest -v -s test_foo.py

test_foo.py::test_a
before: test_a
PASSED
after: test_a

test_foo.py::test_b
before: test_b
PASSED
after: test_b
  

Комментарии:

1. это работает очень хорошо. Я в основном работаю над определением def wrapper(request) один раз и использованием from helper_common_imports import * , обернутого некоторыми дополнительными условиями, чтобы написать его только один раз и запускать только при pytest и с определенными условиями. но, да, тогда я должен иметь возможность запускать произвольные проверки между тестами в любом импортируемом тестовом файле helper_common_imports.py . кроме того, в этом request.node объекте содержится множество информации. очень приятно, спасибо.