2013-02-18 7 views
6

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

मुझे परीक्षण सूट उत्पन्न करने वाले कोड के साथ समस्याएं आ रही हैं।

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

class TestSomething(unittest.TestCase): 

    def setUp(self): 
     ... 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

suite = unittest.TestSuite() 
suite.addTest(unittest.makeSuite(TestSomething)) 

जो "सीधा" तरीका है, यह सभी नाक उदाहरण और ट्यूटोरियल दिखाता है, और यह काम करता है। हालांकि, दूसरी तरह से एक परीक्षण वर्ग है कि सभी परीक्षण तर्क होता है परिभाषित, तो विभिन्न उपवर्गों कि अलग अलग सेटअप विन्यास सुपर क्लास से परीक्षण होते हैं और वारिस में परीक्षण मामलों बनाने के द्वारा है:

class TestSomething(unittest.TestCase): 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

class TestCase1(TestSomething): 

    def setUp(self): 
     ... 

class TestCase2(TestSomething): 

    def setUp(self): 
     ... 

suite = unittest.TestSuite() 

cases = [TestCase1,TestCase2] 
suite.addTests([unittest.makeSuite(case) for case in cases]) 

यह वही नाक विफल हो जाता है साथ में। यह परीक्षण विधियों को पहले चलाने की कोशिश करता है, जो स्पष्ट रूप से काम नहीं करता है क्योंकि superclass में कोई setUp() नहीं है और test_x() और test_y() में उपयोग किए गए कई चरों को अभी तक परिभाषित नहीं किया गया है।

मुझे इसे कहीं भी किए गए किसी भी उदाहरण नहीं मिला है, और नाक (बल्कि नेविगेट करने के लिए दुर्लभ और मुश्किल) दस्तावेज का उल्लेख यह प्रतीत नहीं होता है। यह नाक के साथ काम करने के लिए कैसे बनाया जा सकता है? किसी भी प्रकार की सहायता सराहनीय होगी।

उत्तर

13

सबसे पहले, के रूप में unutbu बताया गया है, आप TestSomething करने के लिए एक ऐसा नाम है जो, Test साथ शुरू होता है क्योंकि nose स्वचालित रूप से परीक्षण मामलों के रूप में इस तरह के वर्गों व्यवहार करता है नहीं देना चाहिए। इसके अलावा, nose वह पाता है सब TestCase उपवर्गों चलाता है, इस प्रकार कर रही:

class Something(unittest.TestCase): 
    ... 

बिल्कुल वैसा ही परिणाम आप कर रहे हैं देता है। मुझे लगता है कि आप TestCase से विरासत नहीं करना चाहिए और के रूप में एक मिश्रण में उस वर्ग का उपयोग करें:

class Something(object): 
    def test_x(self): 
     # here the various assertEqual etc. do not resolve, but you can use them 
     # as if they were present, since in real test-cases they will be inherited 
     # from unittest.TestCase. 
     ... 
    ... 

class TestCase1(unittest.TestCase, Something): 
    def setUp(self): 
     ... 

यह करने के लिए एक अन्य तरीका स्थापित करने के लिए है वर्ग के __test__ विशेषता False रहे हैं:

class TestSomething(unittest.TestCase): 
    __test__ = False 
    def test_x(self): 
     ... 


class TestCase1(TestSomething): 
    __test__ = True #must put this 
    def setUp(self): 
     ... 

वैकल्पिक रूप से आप नाक डेकोरेटर का उपयोग

@tools.nottest 
class TestSomething(unittest.TestCase): 
    def test_x(self): 
     ... 

@tools.istest 
class TestCase1(TestSomething): 
    sef setUp(self): 
     ... 
+0

: चिह्नित करने के लिए कौन सी क्लास एक testcase है और जो एक नहीं है nose.istest और nose.nottest उपयोग कर सकते हैं चाल चल रही है; वापस देखकर, यह अब बहुत स्पष्ट प्रतीत होता है लेकिन कभी-कभी सबसे स्पष्ट समाधान सबसे अधिक छिपे हुए होते हैं ... युक्तियों के लिए बहुत धन्यवाद! – Boris

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