#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
объекте содержится множество информации. очень приятно, спасибо.