स्वचालित परीक्षण के एक सेट के लिए केवल एक बार सेटअप चलाएं


81

मेरा पायथन संस्करण 2.6 है।

मैं परीक्षण सेटअप विधि को केवल एक बार निष्पादित करना चाहूंगा क्योंकि मैं वहां ऐसी चीजें करता हूं जो सभी परीक्षणों के लिए आवश्यक हैं।

मेरा विचार एक बूलियन वैरिएबल बनाना था जो पहले निष्पादन के बाद 'सही' पर सेट हो जाएगा और फिर सेटअप विधि में एक से अधिक कॉल को निष्क्रिय कर देगा।

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(self.setup_done)
            
        if self.setup_done:
            return
        self.setup_done = True
        print str(self.setup_done)

उत्पादन:

False

True

--- Test 1 ---

False

True

--- Test 2 ---

यह काम क्यों नहीं कर रहा है क्या मैं कुछ भूल गया?


6
यूनीटेस्ट प्रत्येक परीक्षण के लिए अलग-अलग उदाहरण बनाता है
डेविड रॉबिन्सन

2
यह मत करो। कुछ अन्य तंत्र को लागू करें। लेकिन का अर्थ बदलने की कोशिश मत करो setUp
डेविड हेफर्नन

जवाबों:


115

आप उन setUpClassतरीकों को परिभाषित करने के लिए उपयोग कर सकते हैं जो केवल एक बार परीक्षण के अनुसार चलते हैं।


आपके जवाब के लिए धन्यवाद। जब से मैं पाइथन 2.6.6 का उपयोग कर रहा हूँ सेटअप क्लॉस उपलब्ध नहीं है।
Kesandal

2
@ जॉनम: आप यूनीटेस्ट 2 बैकपोर्ट पैकेज डाउनलोड कर सकते हैं और अपने पुराने अजगर-डिस्ट्रेस पर सभी नए सामान प्राप्त कर सकते हैं।
मैके

यह प्रश्न पायथन 2 से संबंधित है, लेकिन चूंकि उत्तर पायथन 3 के लिए भी मान्य है, इसलिए मैंने URL को बदल दिया है क्योंकि पायथन 2 को हटा दिया गया है।
21

66

डैनियल का जवाब सही है, लेकिन यहां कुछ सामान्य गलतियों से बचने के लिए एक उदाहरण है, जैसे कि जब (जैसे या ) का उपवर्ग super()में कॉल नहीं हो रहा हो ।setUpClass()TestCaseunittest.TestCasedjango.testfalcon.testing

इस दस्तावेज़ में setUpClass()यह उल्लेख नहीं है कि आपको super()ऐसे मामलों में कॉल करने की आवश्यकता है । यदि आप इस संबंधित प्रश्न में दिखाई नहीं देते हैं, तो आपको एक त्रुटि मिलेगी ।

class SomeTest(TestCase):
    def setUp(self):
        self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource)

    @classmethod
    def setUpClass(cls):
        """ get_some_resource() is slow, to avoid calling it for each test use setUpClass()
            and store the result as class variable
        """
        super(SomeTest, cls).setUpClass()
        cls.the_resource = get_some_resource()

1
ध्यान दें कि यह तब ही प्रासंगिक होता है जब TestCaseउप-वर्ग होता है unittest.TestCase
एलियाडल

3

यदि आप परीक्षण के लिए कुछ डेटा लोड करने की आवश्यकता के कारण यहां समाप्त हो गए ... तो जहाँ तक आप Django 1.9+ का उपयोग कर रहे हैं, कृपया setUpTestData के लिए जाएं :

class MyTests(TestCase):

    @classmethod
    def setUpTestData(cls):
        # Set up data for the whole TestCase
        cls.foo = Foo.objects.create(bar="Test")

    def test1(self):
        self.assertEqual(self.foo.bar, 'Test') 

2

सेटअप करने के लिए कॉल को काटने का प्रयास न करें, बस एक बार कॉल करें।

उदाहरण के लिए:

class MyClass(object):
    ...

def _set_up():
    code to do one-time setup

_set_up()

यह मॉड्यूल के पहले लोड होने पर _set_up () कॉल करेगा। मैंने इसे एक मॉड्यूल-स्तरीय फ़ंक्शन के रूप में परिभाषित किया है, लेकिन आप इसे समान रूप से MyClass का एक वर्ग तरीका बना सकते हैं।


2

वह सभी कोड रखें जो आप mySelTest के बाहर एक बार सेट करना चाहते हैं।

setup_done = False

class mySelTest(unittest.TestCase):

    def setUp(self):
        print str(setup_done)

        if setup_done:
            return

        setup_done = True
        print str(setup_done)

एक और संभावना है कि आपके पास एक सिंगलटन क्लास है setUp(), जिसमें आप तुरंत __new__कॉल करते हैं , जो केवल एक बार कोड चलाएगा और बाकी कॉल्स के लिए ऑब्जेक्ट इंस्टेंस लौटाएगा। देखें: क्या सिंगलेट्स को परिभाषित करने का एक सरल, सुरुचिपूर्ण तरीका है?

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(
                            cls, *args, **kwargs)
            # PUT YOUR SETUP ONCE CODE HERE!
            cls.setUpBool = True

        return cls._instance

class mySelTest(unittest.TestCase):

    def setUp(self):
        # The first call initializes singleton, ever additional call returns the instantiated reference.
        print(Singleton().setUpBool)

आपका तरीका बहुत काम करता है।


2

setup_done एक वर्ग चर है, उदाहरण चर नहीं।

आप इसे एक उदाहरण चर के रूप में संदर्भित कर रहे हैं:

self.setup_done

लेकिन आपको इसे एक वर्ग चर के रूप में संदर्भित करने की आवश्यकता है:

mySelTest.setup_done

यहाँ सही कोड है:

class mySelTest(unittest.TestCase):
    setup_done = False

    def setUp(self):
        print str(mySelTest.setup_done)

        if mySelTest.setup_done:
            return
        mySelTest.setup_done = True
        print str(mySelTest.setup_done)

2

मैं पायथन 3 का उपयोग कर रहा हूं और पाया कि clsसंदर्भ setupविधि में भी उपलब्ध है और इसलिए निम्नलिखित काम करता है:

class TestThing(unittest.TestCase):

  @classmethod
  def setUpClass(cls):
    cls.thing = Thing() # the `thing` is only instantiated once

  def setup(self):
    self.thing = cls.thing # ...but set on each test case instance

  def test_the_thing(self):
    self.assertTrue(self.thing is not None)

1
आप सेटअप के भीतर cls का उपयोग नहीं कर सकते हैं, जो कि एक उदाहरण विधि है (निचला केस सेटअप () नहीं कहा जाएगा, क्योंकि यह एक unittest सेटअप विधि नहीं है, और न ही 'परीक्षण' से शुरू होने वाली विधि है, जो संभवतः आपको नहीं मिली है। एक त्रुटि) हालाँकि, एक बार जब आप setUpClass में वर्ग चर को परिभाषित करते हैं, तो आप बस सभी उदाहरण विधियों में आत्म.थिंग कह सकते हैं
khuang834

धन्यवाद, @ khuang834 आप सही हे। यह मेरी ओर से एक निरीक्षण था।
ग्रेग रॉस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.