Как временно скрыть stdout или stderr во время запуска unittest в Python
У меня есть неисправный модуль python третьей стороны, который выводит на stdout или stderr во время его импорта, и это нарушает выходные данные моих unittests.
Как я могу временно перенаправить stdout
, чтобы скрыть свой вывод.
Предел синтаксиса Python 2.5:)
Обновить, я забыл упомянуть, что методы sys.stdout
и sys.__stderr__
не работают в этом случае. Насколько я знаю, этот неисправный модуль использует собственный код.
Ответы
Ответ 1
Вы можете сделать это примерно так:
>>> import sys, os
>>> _stderr = sys.stderr
>>> _stdout = sys.stdout
>>> null = open(os.devnull,'wb')
>>> sys.stdout = sys.stderr = null
>>> print "Bleh"
>>> sys.stderr = _stderr
>>> sys.stdout = _stdout
>>> print "Bleh"
Bleh
Ответ 2
Вы также можете использовать mock
, чтобы вы могли патч sys.stdout
и sys.stderr
для вас, когда модуль импортируется. Примером модуля тестирования, использующего эту стратегию, будет:
import os
devnull = open(os.devnull, 'w')
from mock import patch
with patch('sys.stdout', devnull):
with patch('sys.stderr', devnull):
import bad_module
# Test cases writen here
где bad_module
- это сторонний модуль, который печатает на sys.stdout
и sys.stderr
при импорте.