বিভিন্ন পরীক্ষার জন্য ইউনিটেটেস্ট সেটআপ / টিয়ারডাউন


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
কোন সংস্করণ? পাইথন ২.7-এ একটি মডিউল_সেটআপ এবং মডিউল_আউটডাউন অন্তর্ভুক্ত করার জন্য ইউনিটেস্ট মডিউলটি প্রসারিত করা হয়েছে।
এস.লট

3
২.7 এছাড়াও সেটআপস ক্লাস () এবং টিয়ারডাউনক্লাস () শ্রেণীবদ্ধদের প্রবর্তন করেছে, যা আপনাকে তাদের নিজস্ব স্যুট সেটআপ এবং টিয়ারডাউন সহ একই ফাইলে কয়েকটি ক্লাস করতে দেয়।
ফাগরেল

উত্তর:


132

২.7 ( ডকুমেন্টেশন অনুযায়ী ) হিসাবে আপনি পাবেন setUpClassএবং tearDownClassযা প্রদত্ত শ্রেণীর পরীক্ষাগুলির আগে এবং পরে যথাক্রমে সঞ্চালিত হয়। বিকল্পভাবে, আপনি যদি একটি ফাইলের মধ্যে তাদের একদল আছে, আপনি ব্যবহার করতে পারেন setUpModuleএবং tearDownModule( ডকুমেন্টেশন )।

অন্যথায় আপনার সেরা বাজি সম্ভবত আপনার নিজস্ব উত্পন্ন টেস্টসুইট তৈরি করতে এবং ওভাররাইড করতে চলেছেrun() । অন্যান্য সমস্ত কল পিতা-মাতার দ্বারা পরিচালিত হবে এবং পিতামাতার runপদ্ধতিতে কল করার জন্য আপনার সেটআপ এবং টিয়ারডাউন কোডটি কল করবে ।


71

আমার একই দৃশ্য রয়েছে, আমার জন্য সেটআপস ক্লাস এবং টিয়ারডাউনক্লাস পদ্ধতিগুলি পুরোপুরি কার্যকরভাবে কাজ করে

import unittest

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

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

6
এটি গ্রহণযোগ্য উত্তর হিসাবে আপডেট হওয়া উচিত কারণ এটি একটি সঠিক উদাহরণ দেখায় এবং এই ফাংশনগুলি কাজ করার জন্য শ্রেণিবদ্ধ হতে হবে, যা গ্রহণযোগ্য উত্তরে উল্লেখ করা হয়নি।
নিউক্লিয়ারপিয়ন

1

অজগর 2.5 এর জন্য এবং পাইদেবের সাথে কাজ করার সময় এটি কিছুটা শক্ত। দেখা যাচ্ছে যে পাইদেব পরীক্ষার স্যুটটি ব্যবহার করেন না, তবে সমস্ত স্বতন্ত্র পরীক্ষার কেস খুঁজে পান এবং সেগুলি পৃথকভাবে চালান।

এর জন্য আমার সমাধানটি ক্লাস ভেরিয়েবলের মতো ব্যবহার করছিল:

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), runCountআপনিও 0 এর উত্তরাধিকারী হন Then তারপরে রান পদ্ধতিতে,runCount শিশু testcase এর চেক করা এবং মান বৃদ্ধি হয়। এটি runCount0 এ এই শ্রেণীর জন্য পরিবর্তনশীল ছেড়ে যায় ।

এর অর্থ 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.