2012-08-16 12 views
10

में परिणाम प्राप्त करना मैं नाक परीक्षण धावक का उपयोग करते समय, एक विशेष परीक्षण विधि का परिणाम प्राप्त करने और इसे टियरडाउन विधि के अंदर आउटपुट करने में सक्षम होना चाहता हूं। here का एक बहुत अच्छा उदाहरण है।पाइथन के नोसेटेट्स को एक आंसू() विधि

लेकिन दुर्भाग्य से, चल nosetests example.py काम नहीं करता है, के बाद से नाक तथ्य यह है कि सुपर क्लास में रन विधि अधिरोहित किया जा रहा है की तरह प्रतीत नहीं होता:

AttributeError: 'ResultProxy' object has no attribute 'wasSuccessful' 

उत्तर

-1

आप कुछ बॉयलरप्लेट कोड को जोड़ने के साथ ठीक कर रहे हैं परीक्षणों के लिए, निम्नलिखित की तरह कुछ काम कर सकता है।

माईटेस्ट 1 में, tearDown प्रत्येक परीक्षण के अंत में बुलाया जाता है, और self.result का मान विधि नाम और एक शब्दकोश युक्त टुपल पर सेट किया गया है (लेकिन आप जो भी चाहें उसे सेट कर सकते हैं)। निरीक्षण मॉड्यूल का उपयोग विधि नाम प्राप्त करने के लिए किया जाता है, इसलिए tearDown जानता है कि कौन सा परीक्षण अभी भाग गया है।

MyTest2 में, सभी परिणाम एक शब्दकोश (results) है, जो तुम क्या आप tearDownClass विधि में पसंद के साथ कर सकते में सहेजे जाते हैं।

import inspect 
import unittest 


class MyTest1(unittest.TestCase): 

    result = None 

    def tearDown(self): 
     print "tearDown:", self.result 

    def test_aaa(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.result = (name, None) 

     x = 1 + 1 
     self.assertEqual(x, 2) 

     self.result = (name, dict(x=x)) 

    def test_bbb(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.result = (name, None) 

     # Intentional fail. 
     x = -1 
     self.assertEqual(x, 0) 

     self.result = (name, dict(x=x)) 


class MyTest2(unittest.TestCase): 

    results = {} 

    @classmethod 
    def tearDownClass(cls): 
     print "tearDownClass:", cls.results 

    def test_aaa(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.results[name] = None 

     x = 1 + 1 
     self.assertEqual(x, 2) 

     self.results[name] = dict(x=x) 

    def test_bbb(self): 
     frame = inspect.currentframe() 
     name = inspect.getframeinfo(frame).function 
     del frame 
     self.results[name] = None 

     x = -1 
     self.assertEqual(x, 0) 

     self.results[name] = dict(x=x) 


if __name__ == '__main__': 
    unittest.main() 
+1

चूंकि यह थोड़ा हैकिश और संभवतः भंगुर है (उदाहरण के लिए पायथन 3 में परीक्षण नहीं किया गया है), डाउनवोट है शायद यह योग्य है। मैं इसे अपने उत्पादन कोड में उपयोग नहीं करूँगा। दूसरी तरफ, ऐसा लगता है; व्यावहारिकता शुद्धता को धड़कता है और यह सब –

5

चेतावनी: निम्नलिखित वास्तव में आंसू के दौरान परीक्षण तक नहीं पहुंचता है, लेकिन यह प्रत्येक परिणाम तक पहुंचता है।

आप एक नाक प्लगइन लिखना चाहेंगे (see the API documentation here)। जिस विधि में आप शायद रुचि रखते हैं वह afterTest() है, जो परीक्षण के बाद ... चलाया जाता है। :) हालांकि, आपके सटीक अनुप्रयोग के आधार पर, handleError()/handleFailure() या finalize() वास्तव में अधिक उपयोगी हो सकता है।

यहां एक उदाहरण प्लगइन है जो निष्पादित होने के तुरंत बाद परीक्षण के परिणाम तक पहुंचता है।

from nose.plugins import Plugin 
import logging 
log = logging.getLogger('nose.plugins.testnamer') 

class ReportResults(Plugin): 
    def __init__(self, *args, **kwargs): 
     super(ReportResults, self).__init__(*args, **kwargs) 
     self.passes = 0 
     self.failures = 0 
    def afterTest(self, test): 
     if test.passed: 
      self.passes += 1 
     else: 
      self.failures += 1 
    def finalize(self, result): 
     print "%d successes, %d failures" % (self.passes, self.failures) 

यह तुच्छ उदाहरण केवल पास और विफलताओं की संख्या (लिंक की तरह आप शामिल रिपोर्ट करती है, लेकिन मुझे यकीन है कि आप और अधिक दिलचस्प कुछ (here's another fun idea) करने के लिए यह विस्तार कर सकते हैं कर रहा हूँ। इस का उपयोग करने के लिए, कि यह सुनिश्चित कर लें यह नाक में स्थापित है (या इसे कस्टम धावक में लोड करें), और उसके बाद इसे --with-reportresults के साथ सक्रिय करें।

+0

आपका कोड इन पंक्तियों में त्रुटियों को दिखाता है: पास = = 1 और विफलताओं + 1 (अपरिभाषित चर त्रुटि) – Cas

+0

धन्यवाद। मैं प्रारंभिक जोड़ दूंगा। – dbn

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