Çıktıyı yakalamak için bu bağlam yöneticisini kullanıyorum . Nihayetinde, geçici olarak değiştirerek diğer yanıtların bazıları ile aynı tekniği kullanır sys.stdout
. Bağlam yöneticisini tercih ediyorum çünkü tüm defter tutmayı tek bir işleve sarıyor, bu yüzden herhangi bir deneme kodunu yeniden yazmak zorunda değilim ve sadece bunun için kurulum ve sökme işlevlerini yazmak zorunda değilim.
import sys
from contextlib import contextmanager
from StringIO import StringIO
@contextmanager
def captured_output():
new_out, new_err = StringIO(), StringIO()
old_out, old_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = new_out, new_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = old_out, old_err
Bunu şu şekilde kullanın:
with captured_output() as (out, err):
foo()
# This can go inside or outside the `with` block
output = out.getvalue().strip()
self.assertEqual(output, 'hello world!')
Ayrıca, orijinal çıktı durumu with
bloktan çıkıldığında geri yüklendiğinden, ilkiyle aynı işlevde ikinci bir yakalama bloğu oluşturabiliriz, bu kurulum ve sökme işlevlerini kullanarak mümkün değildir ve dene-nihayet yazarken kelimelere dökülür. manuel olarak engeller. Bu yetenek, bir testin amacı önceden hesaplanmış bir değerden ziyade iki işlevin sonuçlarını birbirine göre karşılaştırmak olduğunda kullanışlı oldu.
with mock.patch('sys.stdout', new_callable=StringIO.StringIO):
pypi.python.org/pypi/mock