পাইথন ইউনিটেস্টে সেটআপ () এবং সেটআপস ক্লাস () এর মধ্যে পার্থক্য কী?


105

পাইথন কাঠামোর মধ্যে setUp()এবং setUpClass()মধ্যে পার্থক্য কী unittest? সেটআপটি অন্য পদ্ধতিতে কেন একটি পদ্ধতিতে পরিচালিত হবে?

আমি বুঝতে কি সেটআপ অংশ সম্পন্ন করা হয় চান setUp()এবং setUpClass()সাথে ফাংশন, সেইসাথে tearDown()এবং tearDownClass()

উত্তর:


155

যখন আপনার ক্লাসে একাধিক পরীক্ষার পদ্ধতি থাকে তখন পার্থক্যটি প্রকাশ পায়। setUpClassএবং tearDownClassপুরো ক্লাসের জন্য একবার চালানো হয়; setUpএবং tearDownপ্রতিটি পরীক্ষার পদ্ধতির আগে এবং পরে চালানো হয়।

উদাহরণ স্বরূপ:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

আপনি যখন এই পরীক্ষাটি চালান, এটি মুদ্রণ করে:

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(বিন্দু ( .) হয় unittestএর ডিফল্ট আউটপুট যখন একটি পরীক্ষা প্রেরণ করা হয়।) যে পালন setUpএবং tearDownআগে ও পরে প্রদর্শিত test1 এবং test2 , যেহেতু setUpClassএবং tearDownClassশুধুমাত্র একবার দেখা শুরুতে এবং পুরো পরীক্ষা ক্ষেত্রে শেষে।


আদেশ কি এই হওয়া উচিত নয়? : SetUpClass সেটআপ পাচ্ছেন test1 টিয়ারডাউন .setUp test2 | .tearDown tearDownClass
জয় শর্মা

"লক্ষ্য করুন।" টিয়ারডাউন এবং "এর অনুপস্থিতির সামনে"। টিয়ারডাউনক্লাসের সামনে
জয় শর্মা

আহ, দুঃখিত, এটি খুঁজে পেল না। না, unittestকোনও tearDownঘটনা ঘটনা ছাড়াই শেষ না হওয়া অবধি কোনও পরীক্ষা পাস হওয়ার কথা বিবেচনা করে না ।
বেনিয়ামিন হজসন

সুতরাং প্রতিটি টেস্ট 1 এবং টেস্ট 2 এর নিজস্ব সেটআপ এবং টিয়ারডাউন থাকা উচিত, তাই না? আপনার উত্তরে, টেস্ট 1 এর টিয়ারডাউন পদ্ধতি নেই এবং সুতরাং এটি ডিফল্ট আউটপুট (। দিয়ে) মুদ্রণ করা উচিত। আমি ভুল হলে শুধরে.
জয় শর্মা

4
উত্তরের আউটপুটটি সঠিক। আমি এটিকে সরাসরি ইউনিটেস্টের আউটপুট থেকে আটকালাম। setUpএবং tearDownপ্রতিটি testপদ্ধতির জন্য প্রতিটি রান হয় (সুতরাং এই উদাহরণে মোট দ্বিগুণ) তবে setUpClassএবং tearDownClassএকবারে একবার চালানো হয়।
বেঞ্জামিন হজসন

17

পাইথন কাঠামোর মধ্যে setUp()এবং setUpClass()মধ্যে পার্থক্য কী unittest?

মূল পার্থক্য (যেমন বেঞ্জামিন হজসনের উত্তরে উল্লিখিত) এটি setUpClassকেবল একবার বলা হয় এবং এটি সমস্ত পরীক্ষার আগে, যখন setUpপ্রতিটি পরীক্ষার আগেই ডাকা হয়। (এনবি: একই পাইথনের নয়, অন্যান্য এক্স ইউনাইট টেস্ট ফ্রেমওয়ার্কগুলিতেও সমতুল্য পদ্ধতির ক্ষেত্রে এটি একই প্রযোজ্য unittest))

unittest ডকুমেন্টেশন থেকে :

setUpClass()

একটি পৃথক শ্রেণিতে পরীক্ষা চালানোর আগে ডাকা একটি শ্রেণির পদ্ধতি। সেটআপ ক্লাসকে ক্লাসের সাথে একমাত্র যুক্তি হিসাবে ডাকা হয় এবং অবশ্যই তাকে শ্রেণীবদ্ধ () হিসাবে সাজানো উচিত:

@classmethod
def setUpClass(cls):
    ...

এবং:

setUp()

পরীক্ষার স্থিরতা প্রস্তুত করার জন্য পদ্ধতিটি ডাকা হয়। এটি পরীক্ষা পদ্ধতি কল করার আগেই বলা হয়; AssertionError বা SkipTest ব্যতীত, এই পদ্ধতিতে উত্থাপিত কোনও ব্যতিক্রম পরীক্ষা ব্যর্থতার পরিবর্তে ত্রুটি হিসাবে বিবেচিত হবে। ডিফল্ট বাস্তবায়ন কিছুই করে না।

সেটআপটি অন্য পদ্ধতিতে কেন একটি পদ্ধতিতে পরিচালিত হবে?

প্রশ্নের এই অংশটির এখনও উত্তর দেওয়া হয়নি। গিয়ারের উত্তরের জবাবে আমার মন্তব্য অনুসারে, setUpপদ্ধতিটি এমন পরীক্ষার উপাদানগুলির জন্য যা সমস্ত পরীক্ষার জন্য সাধারণ (প্রতিটি পরীক্ষায় সেই কোডটির অনুলিপি এড়ানোর জন্য) বোঝানো হয়। আমি এটি প্রায়শই ডুপ্লিকেশন অপসারণ (সাধারণত) পঠনযোগ্যতা উন্নত করে এবং রক্ষণাবেক্ষণের বোঝা হ্রাস করে বলে দরকারী।

setUpClassপদ্ধতি ব্যয়বহুল উপাদানের জন্য আপনি বরং শুধুমাত্র যেমন একটি ডাটাবেস সংযোগ ইত্যাদি খুলে ফাইলসিস্টেম একটি অস্থায়ী ফাইল খোলার, টেস্টিং জন্য একটি ভাগ গ্রন্থাগার লোড, এই ধরনের জিনিসগুলি আগে প্রতিটি পরীক্ষা মন্দীভূত করবে, একবার যা করতে হবে যে পরীক্ষার স্যুটটি খুব বেশি, সুতরাং আমরা সমস্ত পরীক্ষার আগে কেবল এটি করি। এটি পরীক্ষাগুলির স্বাধীনতায় কিছুটা অবনতি হলেও কিছু পরিস্থিতিতে প্রয়োজনীয় অপ্টিমাইজেশন। যুক্তিযুক্তভাবে, ইউনিট টেস্টে এমন কোনও কাজ করা উচিত নয় কারণ সাধারণত আসল জিনিসটি ব্যবহার না করেই ডাটাবেস / ফাইল সিস্টেম / লাইব্রেরি / যাই হোক না কেন উপহাস করা সম্ভব। যেমন, আমি খুঁজে পাই যে setUpClassখুব কমই প্রয়োজন হয়। তবে উপরের উদাহরণগুলি পরীক্ষা করার সময় এটি দরকারী (বা অনুরূপ) প্রয়োজনীয় হয়ে ওঠে।

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