python - pytest: Reusable tests for different implementations of the same interface -


कल्पना करो मैंने एक मॉड्यूल में बार नामक उपयोगिता (शायद एक कक्षा) लागू की है Foo , और इसके लिए निम्नलिखित परीक्षण लिखे हैं।

test_foo.py: <पूर्व> pytest आयात चिह्न से कार्यान्वयन के रूप में foo आयात बार @ mark.parametrize (& Lt; args & gt ;, & lt; टेस्ट डेटा सेट 1 & gt;) def test_one (& lt; आर्ग्स & gt;): & lt; कार्यान्वयन और आर्ग्स & gt; @ चिह्न। पैरामाट्रीज़ (& lt; आर्ग्स & gt ;, & lt; टेस्ट डेटा सेट 2 & gt;) def test_two (& lt; आर्ग्स & gt;): & lt; कार्यान्वयन और आर्ग्स & gt; & Lt; अधिक ऐसे परीक्षण & gt;

अब कल्पना कीजिए, भविष्य में मुझे उम्मीद है कि एक ही इंटरफ़ेस के विभिन्न कार्यान्वयन लिखित होंगे। मैं उन कार्यान्वयनों को उन परीक्षणों का पुन: उपयोग करने में सक्षम होना चाहता हूं जो उपरोक्त परीक्षण सूट के लिए लिखी गई थी: केवल कुछ चीजें जो बदलने की आवश्यकता हैं

  1. कार्यान्वयन
  2. & lt; परीक्षण डेटा सेट 1 & gt; , & lt; परीक्षण डेटा सेट 2 & gt; आदि

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

    पायटेस्ट में यह करने का एक अच्छा, मुहावरेदार तरीका क्या होगा?

    ============= ================================================== =====

    ====================================== ======================================

    यहां एक unstest संस्करण है (लेकिन सुंदर नहीं है) काम करता है।

    define_tests.py:

      इंटरफ़ेस के लिए # एकल, पुन: उपयोग करने योग्य परिभाषा इक्का। अंतरफलक के # नए कार्यान्वयन के लेखक केवल परीक्षण # डेटा प्रदान कर सकते हैं, जैसे कि क्लास के क्लास एट्रिब्यूट्स जो # यूनिट को प्राप्त करता है। टेस्टसीज़ और इस क्लास क्लास TheTests (): डीईएफ़ test_foo (स्वयं): # फ्लाई pytest.mark.parametrize args के लिए looping करके, in_, self.test_foo_data में बाहर: self.assertEqual (self.Emplementation (* args) .foo (in_), बाहर) def test_bar (स्वयं): # फ्लाई pytest.mark.parametrize द्वारा args के लिए looping करके, in_, self.test_bar_data में बाहर: self.assertEqual (self.Emplementation (* args) .bar (in_), बाहर)  < / Pre> 

    v1.2:

      इंटरफ़ेस वर्ग कार्यान्वयन के # एक कार्यान्वयन: def __init __ (आत्म, ए, बी): self.n = a + b def foo (self , एन): रिटर्न स्व.एन + एन डेफ बार (स्व, एन): रिटर्न स्व। N - n   

    v1_test.py:

      # V1 आयात से इंटरफेस के एक कार्यान्वयन के लिए टेस्ट टेस्ट सीट से कार्यान्वित करना परिभाषित आयात टेस्ट केस से आयातित टेस्ट सीज़ # अकेले उत्तराधिकारी द्वारा परीक्षण ढांचे में हुक। टेस्टकैस और फिर से उपयोग # जो इंटरफ़ेस के प्रत्येक * Define_tests से। टेस्ट वर्ग FooTests (टेस्ट सीज़, TheTests): कार्यान्वयन = कार्यान्वयन आयन test_foo_data = (((1,2), 3, 6), ((4,5), 6, 15)) test_bar_data = (((1,2), 3, 0), ((4,5), 6, 3))   

    कोई भी (इस पुस्तकालय का एक ग्राहक भी) इस अंतरफलक का एक और कार्यान्वयन लेखन

    • <
    • किसी भी मूल फाइल को संशोधित किए बिना
    • यह एक महान उपयोग के लिए मामला है।

      आपका कोड कुछ ऐसा दिख सकता है:

        से foo import bar, baz @ pytest.fixture (params = [bar, baz]) def कार्यान्वयन (अनुरोध): वापसी अनुरोध। पीआरएएम डीईएफ़ test_one (कार्यान्वयन): लागूकरण लागू करें ()। frobnicate ()   

      यह दोबारा चलाने वाला test_one होगा: एक बार जहां कार्यान्वयन = बार और एक बार जहां कार्यान्वयन = बाज़।

      ध्यान दें कि चूंकि कार्यान्वयन सिर्फ एक स्थिरता है, आप इसके दायरे को बदल सकते हैं, या अधिक सेटअप कर सकते हैं (शायद कक्षा इन्स्तांत, शायद इसे कॉन्फ़िगर करें किसी तरह)।

      यदि pytest.mark.parametrize डेकोरेटर के साथ प्रयोग किया जाता है, तो pytest सभी क्रमपरिवर्तन उत्पन्न करेगा। उदाहरण के लिए, ऊपर कोड मानते हुए, और यह कोड यहां है:

        @ pytest.mark.parametrize ('वस्तु', [1, 2]) def test_two (कार्यान्वयन, बात): लागूकरण लागू करना (बात) .foo == बात   

      test_two चार बार चलाएगा, निम्न विन्यास के साथ:

      • कार्यान्वयन = बार
      • कार्यान्वयन = बार, वस्तु = 2
      • कार्यान्वयन = बाज़, वस्तु = 1
      • कार्यान्वयन = बाज़, चीज = 2

Comments

Popular posts from this blog

php - PDO bindParam() fatal error -

logging - How can I log both the Request.InputStream and Response.OutputStream traffic in my ASP.NET MVC3 Application for specific Actions? -

java - Why my included JSP file won't get processed correctly? -