कई परीक्षणों के लिए सबसे अच्छा सेटअप / टियरडाउन


118

क्या कोई ऐसा कार्य है, जो कई प्रकार के परीक्षणों की शुरुआत / अंत में निकाल दिया जाता है? सेटअप और टियरडाउन को हर एक परीक्षण से पहले / बाद में निकाल दिया जाता है।

मैं आमतौर पर यह करना चाहूंगा:

class TestSequenceFunctions(unittest.TestCase):

    def setUpScenario(self):
        start() #launched at the beginning, once

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

    def tearDownScenario(self):
        end() #launched at the end, once

अभी के लिए, ये सेटअप और टियरडाउन इकाई परीक्षण हैं और मेरे सभी परिदृश्यों (कई परीक्षणों से युक्त) में फैले हुए हैं, एक पहला परीक्षण है, दूसरा अंतिम परीक्षण है।


6
कौन सा संस्करण? पायथन 2.7 में एक मॉड्यूल_सेटअप और मॉड्यूल_टियरडाउन को शामिल करने के लिए सबसे अच्छे मॉड्यूल का विस्तार किया गया है।
S.Lott

3
2.7 ने setUpClass () और teardownClass () classmethods की शुरुआत की, जो आपको अपने स्वयं के प्रति-सूट सेटअप और फाड़ के साथ एक ही फ़ाइल में कई कक्षाएं देगा।
फागरेल

जवाबों:


132

2.7 के अनुसार ( प्रलेखन के अनुसार ) आप प्राप्त करते हैं setUpClassऔर tearDownClassजो किसी दिए गए वर्ग में परीक्षणों से पहले और बाद में क्रमशः निष्पादित होते हैं। वैकल्पिक रूप से, यदि आपके पास एक फ़ाइल में उनमें से एक समूह है, तो आप उपयोग कर सकते हैं setUpModuleऔर tearDownModule( प्रलेखन )।

अन्यथा आपका सबसे अच्छा शर्त शायद अपने ही व्युत्पन्न TestSuite और ओवरराइड बनाने के लिए होने जा रहा है run()। अन्य सभी कॉल माता-पिता द्वारा नियंत्रित किए जाएंगे, और चलाने से आपके सेटअप और टियरडाउन कोड को माता-पिता की runविधि के लिए कॉल अप हो जाएगा ।


71

मेरे पास एक ही परिदृश्य है, मेरे लिए setUpClass और tearDownClass विधियां पूरी तरह से काम करती हैं

import unittest

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls._connection = createExpensiveConnectionObject()

    @classmethod
    def tearDownClass(cls):
        cls._connection.destroy()

6
इसे स्वीकार किए गए उत्तर के रूप में अपडेट किया जाना चाहिए क्योंकि यह एक सही उदाहरण दिखाता है और इन कार्यों को काम करने के लिए क्लासमेथोड होना चाहिए, जिसे स्वीकार किए गए उत्तर में उल्लेख नहीं किया गया है।
न्यूक्लियरपैन

1

अजगर 2.5 के लिए, और जब pydev के साथ काम कर रहे हैं, तो यह थोड़ा कठिन है। ऐसा प्रतीत होता है कि पाइदेव परीक्षण सूट का उपयोग नहीं करता है, लेकिन सभी व्यक्तिगत परीक्षण मामलों को पाता है और उन सभी को अलग-अलग चलाता है।

इसके लिए मेरा समाधान इस तरह एक वर्ग चर का उपयोग कर रहा था:

class TestCase(unittest.TestCase):
    runCount = 0

    def setUpClass(self):
        pass # overridden in actual testcases

    def run(self, result=None):
        if type(self).runCount == 0:
            self.setUpClass()

        super(TestCase, self).run(result)
        type(self).runCount += 1

इस ट्रिक के साथ, जब आप इसे TestCase(मूल के बजाय unittest.TestCase) से इनहेरिट करते हैं, तो आपको runCount0. का इनहेरिट भी किया जाएगा । फिर रन विधि में, runCountबच्चे के टेस्टकेस की जाँच की जाती है और इंक्रीमेंट किया जाता है। यह runCountइस वर्ग के लिए चर को 0 पर छोड़ता है ।

इसका मतलब है कि setUpClassवसीयत को केवल एक बार प्रति कक्षा और एक बार प्रति बार नहीं चलाया जाएगा।

मेरे पास tearDownClassअभी तक कोई विधि नहीं है, लेकिन मुझे लगता है कि उस काउंटर का उपयोग करके कुछ बनाया जा सकता है।


0

यहां एक उदाहरण है: 3 परीक्षण विधियां एक साझा संसाधन तक पहुंचती हैं, जो एक बार बनाया जाता है, प्रति परीक्षण नहीं।

import unittest
import random

class TestSimulateLogistics(unittest.TestCase):

    shared_resource = None

    @classmethod
    def setUpClass(cls):
        cls.shared_resource = random.randint(1, 100)

    @classmethod
    def tearDownClass(cls):
        cls.shared_resource = None

    def test_1(self):
        print('test 1:', self.shared_resource)

    def test_2(self):
        print('test 2:', self.shared_resource)

    def test_3(self):
        print('test 3:', self.shared_resource)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.