2011-08-24 8 views
13

मैं प्रारूप unittest मानक में एक परीक्षण मॉड्यूल हैरन अजगर unittest ताकि कुछ भी नहीं छपा है यदि सफल, केवल AssertionError() अगर विफल रहता है

class my_test(unittest.TestCase): 

    def test_1(self): 
     [tests] 

    def test_2(self): 
     [tests] 
    etc.... 

मेरी कंपनी एक मालिकाना परीक्षण दोहन कि के रूप में अपने मॉड्यूल पर अमल होगा एक कमांड लाइन स्क्रिप्ट, और जो मेरे मॉड्यूल द्वारा उठाए गए किसी भी त्रुटि को पकड़ लेगा, लेकिन यह आवश्यक है कि सफल होने पर मेरा मॉड्यूल म्यूट हो।

तो, मैं इतना है कि अगर मेरे सभी परीक्षणों तो पारित कुछ भी नहीं स्क्रीन पर छपा है नग्न अपने परीक्षण मॉड्यूल को चलाने के लिए, एक तरह से खोजने की कोशिश कर रहा हूँ, और अगर एक परीक्षण एक AssertionError साथ विफल रहता है, कि त्रुटि के माध्यम से पहुंचाया जाता है मानक अजगर त्रुटि स्टैक (किसी भी अन्य त्रुटि की तरह एक सामान्य अजगर स्क्रिप्ट में होगा।)

docs वकील की तरह किसी दिए गए मॉड्यूल में सभी परीक्षण चलाने के लिए unittest.main() फ़ंक्शन का उपयोग कर

if __name__ == "__main__": 
    unittest.main() 

समस्या यह है कि यह परीक्षण परिणामों को एकजुटता के दोहन में लपेटता है, ताकि यदि सभी परीक्षण सफल हो जाएं, फिर भी यह pr स्क्रीन पर कुछ फूहड़ डालता है, और यदि कोई त्रुटि है, तो इसे सामान्य पाइथन त्रुटि के रूप में नहीं डाला जाता है, बल्कि दोहन में भी पहना जाता है।

मैं एक वैकल्पिक धारा के उत्पादन पुनः निर्देशित यहाँ

with open('.LOG','a') as logf: 
    suite = unittest.TestLoader().loadTestsFromTestCase(my_test) 
    unittest.TextTestRunner(stream = logf).run(suite) 

का उपयोग कर समस्या की कोशिश की है कि सब कुछ लॉग फ़ाइल को पहुंचाया जाता है (त्रुटियों के सभी नोटिस सहित) है। इसलिए जब मेरी कंपनियां दोहन मॉड्यूल चलाती हैं, तो यह पूरी तरह से पूर्ण हो जाती है, जहां तक ​​यह कह सकता है, कोई त्रुटि नहीं उठाई गई थी (क्योंकि वे सभी लॉग फ़ाइल में पाइप किए गए थे)।

कोई सुझाव है कि मैं एक परीक्षण धावक कैसे बना सकता हूं जो सभी फ्लफ को दबाता है, और सामान्य पायथन त्रुटि स्टैक के माध्यम से पाइप त्रुटियों को हल करता है? हमेशा की तरह, अगर आपको लगता है कि इस समस्या से निपटने का एक बेहतर तरीका है, तो कृपया मुझे बताएं।

संपादित करें:

यहाँ क्या मैं इस को हल करने का उपयोग कर समाप्त हो गया है। सबसे पहले, मैं अपने परीक्षण वर्ग के लिए एक "get_test_names()" विधि कहा:

class my_test(unittest.TestCase): 
    etc.... 
    @staticmethod 
    def get_test_names(): 
     """Return the names of all the test methods for this class.""" 
     test_names = [ member[0] for memeber in inspect.getmembers(my_test) 
         if 'test_' in member[0] ] 

तो मैं निम्नलिखित के साथ unittest.main() करने के लिए अपने कॉल की जगह:

# Unittest catches all errors raised by the test cases, and returns them as 
# formatted strings inside a TestResult object. In order for the test 
# harness to catch these errors they need to be re-raised, and so I am defining 
# this CompareError class to do that. 
# For each code error, a CompareError will be raised, with the original error 
# stack as the argument. For test failures (i.e. assertion errors) an 
# AssertionError is raised. 
class CompareError(Exception): 
    def __init__(self,err): 
     self.err = err 
    def __str__(self): 
     return repr(self.err) 

# Collect all tests into a TestSuite() 
all_tests = ut.TestSuite() 
for test in my_test.get_test_names(): 
    all_tests.addTest(my_test(test)) 
# Define a TestResult object and run tests 
results = ut.TestResult() 
all_tests.run(results) 
# Re-raise any script errors 
for error in results.errors: 
    raise CompareError(error[1]) 
# Re-raise any test failures 
for failure in results.failures: 
    raise AssertionError(failure[1]) 

उत्तर

3

मैं इस के साथ आया था। यदि आप कमांड लाइन को बदलने में सक्षम हैं तो आप आंतरिक आईओ रीडायरेक्शन को हटा सकते हैं।

import sys, inspect, traceback 

# redirect stdout, 
# can be replaced by testharness.py > /dev/null at console 
class devnull(): 
    def write(self, data): 
     pass 

f = devnull() 
orig_stdout = sys.stdout 
sys.stdout = f 

class TestCase(): 
    def test_1(self): 
     print 'test_1' 

    def test_2(self): 
     raise AssertionError, 'test_2' 

    def test_3(self): 
     print 'test_3' 


if __name__ == "__main__": 
    testcase = TestCase() 
    testnames = [ t[0] for t in inspect.getmembers(TestCase) 
         if t[0].startswith('test_') ] 

    for testname in testnames: 
     try: 
      getattr(testcase, testname)() 
     except AssertionError, e: 
      print >> sys.stderr, traceback.format_exc() 

# restore 
sys.stdout = orig_stdout 
+0

बहुत अधिक धन्यवाद ग्रिंगो सुवे धन्यवाद। मैंने टेस्टसूइट और टेस्ट रिसेट कक्षाओं का उपयोग करके एक परीक्षण धावक का निर्माण समाप्त कर दिया, लेकिन मैंने आपके कोड से inspect.getmembers() कॉल उठाया। – jeremiahbuddha

+0

@jeremiahbuddha क्या आप उत्तर स्वीकार कर सकते हैं या अपना खुद का लिख ​​सकते हैं और इसे स्वीकार कर सकते हैं? –

संबंधित मुद्दे