2013-01-09 53 views
6

यहाँ मेरी कोड है:पायथन - मैं 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) 

मैं चाहता हूं कि स्क्रीन पर कोई आउटपुट न हो और सब कुछ लॉग इन हो। (मैं एक क्रॉन नौकरी के रूप में परीक्षण चला रहा हूं, इसलिए किसी भी आउटपुट को stdout या stderr को ईमेल भेजने का कारण बनता है, इसलिए मैं यह निर्दिष्ट करने में सक्षम होना चाहता हूं कि यह कब होता है, जिसका अर्थ है कि मुझे इसमें सबसे अचूक नियंत्रण करने में सक्षम होना चाहिए संबंध)

+0

भी बताए 'sys .__ stdout__' और' sys। __stderr__' यहां विफल रहता है - मुझे लगता है कि आउटपुट को पाइथन के भीतर ही रीडायरेक्ट करना असंभव है। – Eric

उत्तर

12

रीडायरेक्ट stderr, जैसे:।

python my_unit_test_launcher.py 2> log.txt 
+1

ठीक है, यह काम करता प्रतीत होता है। मुझे अभी भी यकीन नहीं है कि क्यों stderr रीडायरेक्ट नहीं हो रहा है, क्योंकि मैंने स्पष्ट रूप से इसे अपने प्रोग्राम में रीडायरेक्ट करने के लिए सेट किया है। – jononomo

+5

क्योंकि 'unittest' आपके टेस्ट कोड को एक सैंडबॉक्स में चलाता है जो std स्ट्रीम को लपेटता है। आप अपने टेस्ट कोड के आउटपुट को रीडायरेक्ट कर रहे हैं, लेकिन 'unittest' परवाह नहीं है, क्योंकि' unittest' आमतौर पर आपके आउटपुट को मूल रूप से एक बच्चे की प्रक्रिया के रूप में कैप्चर करता है, फिर इसे संदर्भित संदर्भ में पुनर्जन्म देता है। जो आउटपुट आप देख रहे हैं, वह 'अनियंत्रित' से है, परीक्षण कोड में आप जो करते हैं उससे पूरी तरह से स्वतंत्र है। –

7

अपने testcode भीतर इसे हल करने के लिए, आप निम्न कार्य कर सकता है:

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

'टेक्स्टटेस्टरुनर (स्ट्रीम = sys.stdout)' वही है जो मैं याद कर रहा था। धन्यवाद! –