Благодаря сужению в этом обсуждении, я думаю, что вопрос может быть лучше озаглавлен «В pytest, как собирать предупреждения и выводить их стандартные ошибки в одном тесте?».Учитывая эту предложенную формулировку, я думаю, что ответ «это не может, вам нужен отдельный тест».
Если не было стандартного требования по захвату ошибок, вы должны иметь возможность использовать аннотацию @pytest.mark.filterwarnings
дляthis.
@pytest.mark.filterwarnings("ignore")
def test_one():
assert api_v1() == 1
From: https://docs.pytest.org/en/latest/warnings.html#pytest-mark-filterwarnings
@ wim указывает на то, что в комментарии это не будет зафиксировано предупреждение, а ответ, который он излагает, фиксирует и утверждает предупреждения.стандартным способом.
Если бы был вывод stderr, но не были выданы предупреждения Python, capsys был бы техникой, как вы говорите https://docs.pytest.org/en/latest/capture.html
Я не думаю, что имеет смысл делать обав тесте pytest из-за природы реализации pytest.
Как отмечалось ранее, pytest перенаправляет stderr и т. д. на внутренний рекордер.Во-вторых, он определяет свой собственный обработчик предупреждений https://github.com/pytest-dev/pytest/blob/master/src/_pytest/warnings.py#L59
По идее он аналогичен ответу на этот вопрос: https://stackoverflow.com/a/5645133/5729872
Я немного поковырялся с переопределением warnings.showwarning()
,который отлично работал с vanilla python, но pytest намеренно повторно инициализирует это.
не будет работать в pytest, только прямой питон ->
def func(x):
warnings.warn('wwarn')
print(warnings.showwarning.__doc__)
# print('ewarn', file=sys.stderr)
return x + 1
sworig = warnings.showwarning
def showwarning_wrapper(message, category, filename, lineno, file=None, line=None):
"""Local override for showwarning()"""
print('swwrapper({})'.format(file) )
sworig(message,category,filename,lineno,file,line)
warnings.showwarning = showwarning_wrapper
<- не будет работать в pytest, только прямой питон </em>
Вы, возможно, могли бы добавить обработчик предупреждений в ваш тестовый пример, который будет выводить вstderr ... но это мало что говорит о тестируемом коде.
Это ваша система в конце дня.Если после рассмотрения высказанного @wim замечания о том, что тестирование stderr как таковое может не принести больших результатов, вы решите, что оно вам по-прежнему необходимо, я предлагаю разделить тестирование объекта предупреждения Python (уровень вызывающей стороны python) и содержимого stderr (вызывая shellслой).Первый тест будет рассматривать только объекты предупреждений Python.Новый второй контрольный пример будет вызывать тестируемую библиотеку в виде сценария через popen()
или аналогичный и утверждать полученную стандартную ошибку и вывод.