2013-01-09 34 views
6

Đây là mã của tôi:python - làm thế nào tôi có thể chuyển hướng đầu ra của unittest? giải pháp rõ ràng không hoạt động

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) 

Khi tôi chạy này, nội dung của demo_test.stdout.log duy nhất là:

test one 
test two 

trên màn hình tôi vẫn nhìn thấy đầu ra từ 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) 

Tôi muốn không có đầu ra trên màn hình và mọi thứ được ghi lại. (Tôi đang chạy thử nghiệm như một công việc cron, vì vậy bất kỳ đầu ra stdout hoặc stderr nào cũng sẽ gửi email, vì vậy tôi muốn có thể xác định chính xác khi nào điều này xảy ra, có nghĩa là tôi cần có khả năng kiểm soát unittest trong về)

+0

Thậm chí gán 'stdout__' sys .__ và' sys. __stderr__' thất bại ở đây - Tôi nghĩ rằng nó không thể chuyển hướng đầu ra từ bên trong chính python. – Eric

Trả lời

12

chuyển hướng stderr, ví dụ như:.

python my_unit_test_launcher.py 2> log.txt 
+1

okay, điều này dường như hoạt động. Tôi vẫn không chắc chắn tại sao stderr không được chuyển hướng dù sao, vì tôi rõ ràng đặt nó sẽ được chuyển hướng trong chương trình của tôi. – jononomo

+5

Bởi vì 'unittest' chạy mã thử nghiệm của bạn trong một sandbox kết thúc tốt đẹp các luồng std. Bạn đang chuyển hướng đầu ra của mã thử nghiệm của bạn, nhưng 'unittest' không quan tâm, bởi vì' unittest' bình thường chỉ chụp đầu ra của bạn về cơ bản là của một tiến trình con sau đó regurgitates nó vào ngữ cảnh gọi nó. Đầu ra bạn đang thấy, từ chính bản thân 'unittest', hoàn toàn độc lập với những gì bạn làm trong mã kiểm thử. –

7

Để giải quyết nó trong vòng testcode của bạn, bạn cũng có thể làm như sau:

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) 
+0

'TextTestRunner (stream = sys.stdout)' chỉ là những gì tôi đã mất tích. Cảm ơn! –

Các vấn đề liên quan