Bagaimana saya bisa mengarahkan output dari unittest? Solusi yang jelas tidak berhasil

Ini kode saya:

import unittest
import sys
import os

class DemoTest(unittest.TestCase):
    def test_one(self):
        print "test one"
        self.assertTrue(True)

    def test_two(self):
        print "test two"
        self.assertTrue(False)

if __name__ == '__main__':
    dirpath = os.path.dirname(os.path.abspath(__file__))
    sys.stdout = open(dirpath+'/test_logs/demo_test.stdout.log', 'w')
    sys.stderr = open(dirpath+'/test_logs/demo_test.stderr.log', 'w')
    test_program = unittest.main(verbosity=0, exit=False)

Saat saya menjalankan ini, isi demo_test.stdout.log hanya:

test one
test two

di layar saya masih melihat output dari unittest:

======================================================================
FAIL: test_two (__main__.DemoTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "demotest.py", line 12, in test_two
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=1)

Saya ingin tidak ada keluaran di layar dan semuanya dicatat. (Saya menjalankan pengujian sebagai tugas cron, jadi output apa pun ke stdout atau stderr menyebabkan email terkirim, jadi saya ingin dapat menentukan dengan tepat kapan ini terjadi, yang berarti saya harus dapat mengontrol unittest dalam hal ini pandangan.)


person jononomo    schedule 09.01.2013    source sumber
comment
Bahkan menetapkan sys.__stdout__ dan sys.__stderr__ gagal di sini - saya pikir tidak mungkin untuk mengarahkan output dari dalam python itu sendiri.   -  person Eric    schedule 10.01.2013


Jawaban (2)


pengalihan stderr, misalnya:

python my_unit_test_launcher.py 2> log.txt
person Zaur Nasibov    schedule 09.01.2013
comment
oke, ini sepertinya berhasil. Saya masih tidak yakin mengapa stderr tidak dialihkan, karena saya secara eksplisit mengaturnya untuk dialihkan di program saya. - person jononomo; 10.01.2013
comment
Karena unittest menjalankan kode pengujian Anda di kotak pasir yang membungkus aliran std. Anda mengarahkan keluaran kode pengujian Anda, tetapi unittest tidak peduli, karena unittest biasanya hanya menangkap keluaran Anda sebagai proses anak kemudian memuntahkannya ke konteks yang memanggilnya. Output yang Anda lihat, dari unittest itu sendiri, sepenuhnya tidak bergantung pada apa yang Anda lakukan dalam kode pengujian. - person Silas Ray; 10.01.2013
comment
output=$(python -u some_tests.py 2›&1) && echo $output # Saya mencoba ini dan masih tidak menampilkan apa pun. - person Alex Jansen; 01.03.2019

Untuk mengatasinya dalam kode pengujian Anda, Anda juga dapat melakukan hal berikut:

import sys
import unittest

class DemoTest(unittest.TestCase):
    def test_one(self):
        print "test one"
        self.assertTrue(True)

    def test_two(self):
        print "test two"
        self.assertTrue(False)

if __name__ == "__main__":
    demo_test = unittest.TestLoader().loadTestsFromTestCase(DemoTest)
    unittest.TextTestRunner(stream=sys.stdout).run(demo_test)
person spoorcc    schedule 28.03.2014
comment
TextTestRunner(stream=sys.stdout) hanyalah apa yang saya lewatkan. Terima kasih! - person Jonathon Reinhart; 12.04.2017