ฉันจะเปลี่ยนเส้นทางผลลัพธ์ของ unittest ได้อย่างไร วิธีแก้ปัญหาที่ชัดเจนไม่ได้ผล

นี่คือรหัสของฉัน:

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)

เมื่อฉันรันสิ่งนี้ เนื้อหาของ demo_test.stdout.log จะเป็นเพียง:

test one
test two

บนหน้าจอฉันยังคงเห็นผลลัพธ์จาก 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)

ฉันต้องการให้ไม่มีเอาต์พุตบนหน้าจอและทุกอย่างที่จะบันทึก (ฉันกำลังรันการทดสอบเป็นงาน cron ดังนั้นเอาต์พุตใดๆ ที่ส่งไปยัง stdout หรือ stderr จะทำให้มีการส่งอีเมล ดังนั้นฉันจึงต้องการระบุได้อย่างแน่ชัดว่าสิ่งนี้จะเกิดขึ้นเมื่อใด ซึ่งหมายความว่าฉันต้องสามารถควบคุม unittest ในสิ่งนี้ได้ คำนึงถึง.)


person jononomo    schedule 09.01.2013    source แหล่งที่มา
comment
แม้แต่การกำหนด sys.__stdout__ และ sys.__stderr__ ก็ล้มเหลวที่นี่ - ฉันคิดว่ามันเป็นไปไม่ได้ที่จะเปลี่ยนเส้นทางเอาต์พุตจากภายใน python เอง   -  person Eric    schedule 10.01.2013


คำตอบ (2)


เปลี่ยนเส้นทาง stderr เช่น:

python my_unit_test_launcher.py 2> log.txt
person Zaur Nasibov    schedule 09.01.2013
comment
โอเค ดูเหมือนว่าจะได้ผล ฉันยังไม่แน่ใจว่าเหตุใด stderr จึงไม่ถูกเปลี่ยนเส้นทาง เนื่องจากฉันได้ตั้งค่าอย่างชัดเจนให้เปลี่ยนเส้นทางในโปรแกรมของฉัน - person jononomo; 10.01.2013
comment
เนื่องจาก unittest รันโค้ดทดสอบของคุณในแซนด์บ็อกซ์ที่ล้อมรอบสตรีมมาตรฐาน คุณกำลังเปลี่ยนเส้นทางเอาต์พุตของโค้ดทดสอบของคุณ แต่ unittest ไม่สนใจ เพราะโดยปกติแล้ว unittest จะจับเอาต์พุตของคุณโดยพื้นฐานแล้วเป็นของกระบวนการลูก จากนั้นจึงสำรอกกลับไปสู่บริบทที่เรียกมัน ผลลัพธ์ที่คุณเห็นจาก unittest นั้นเป็นอิสระจากสิ่งที่คุณทำในโค้ดทดสอบโดยสิ้นเชิง - person Silas Ray; 10.01.2013
comment
output=$(python -u some_tests.py 2›&1) && echo $output # ฉันกำลังลองสิ่งนี้ แต่ก็ยังไม่แสดงอะไรเลย - person Alex Jansen; 01.03.2019

หากต้องการแก้ไขภายในรหัสทดสอบของคุณ คุณสามารถทำสิ่งต่อไปนี้ได้:

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) เป็นเพียงสิ่งที่ฉันขาดหายไป ขอบคุณ! - person Jonathon Reinhart; 12.04.2017