अजगर में यूनिट परीक्षण के लिए वैश्विक मापदंडों को ठीक से कैसे संभालना है?


11

हम कई एल्गोरिदम लागू कर रहे हैं, जिनमें आम तौर पर बहुत सारे साझा, सार्वजनिक रूप से ज्ञात और सुरक्षा-प्रासंगिक पैरामीटर हैं।

वर्तमान में, हम बस सभी मापदंडों और दो पूर्वनिर्धारित वैश्विक वस्तुओं को धारण करने वाले एक वर्ग का उपयोग करते हैं:

class PublicParams(object):
    p = q = 0

    def __init__(self, p, q):
        self.p = p
        self.q = q

# used for tests
publicParams_test = PublicParams(15,7)               

# Some 2048 bit numbers for example
publicParams_secure = PublicParams(128378947298374928374,128378947298374928374)  

एल्गोरिदम तब PublicParamsएक तर्क के रूप में एक वस्तु लेता है जो उत्पादक के लिए चूक करता हैpublicParams_secure

def AlgoOne(n, publicParams = publicParams_secure):
    # do stuff with publicParams.p
    # ...
    AlgoTwo(x, publicParams)

तथा

def AlgoTwo(x, publicParams= publicParams_secure):
    # do stuff with publicParams.q

इस तरह हम अभी भी आसान इकाई परीक्षण के लिए विभिन्न सार्वजनिक मापदंडों को इंजेक्ट कर सकते हैं:

class AlgoOneTest(unittest.TestCase):
    def test(self):
        # compare with manually computed result
        self.assertTrue(AlgoOne(1, publicParams_test) == 10) 

मुझे इस दृष्टिकोण के बारे में क्या पसंद नहीं है:

  • publicParamsकुछ एल्गोरिथ्म को कॉल करते समय डिफ़ॉल्ट मान देना वैकल्पिक बनाता है। हालाँकि, जब इसे AlgoTwoभीतर से कॉल किया जाता है, तो इसे भूलना आसान हो जाता है AlgoOne, जिसके परिणामस्वरूप यदि परीक्षण ऑब्जेक्ट को पारित किया गया था, तो दो अलग-अलग वस्तुओं का उपयोग किया जाएगा।AlgoOne

वहाँ एक बेहतर तरीका है जो कम प्रवण है लेकिन फिर भी यूनिट परीक्षण के लिए लचीलापन प्रदान करता है? क्या यह वास्तव में सबसे अच्छा अभ्यास है?

जवाबों:


1

कॉन्फ़िगरेशन फ़ाइलें बनाएँ test_config.pyऔर production_config.py। पर्यावरण चर या कमांड-लाइन तर्क का उपयोग करके उनमें से एक का चयन करें। इसे आयात करें (या पढ़ें / पार्स, यदि आप चुनते हैं .json/ के .txtबजाय .py), और एक मॉड्यूल में वैश्विक ऑब्जेक्ट के माध्यम से पूरे कार्यक्रम के लिए परिणाम उपलब्ध कराएं जिसे आप कहीं भी आयात कर सकते हैं।

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


0

कई चीजें हैं जो आप कर सकते हैं।

  • ग्लोबल्स का उपयोग बंद करें
  • चूक का उपयोग बंद करो
  • हमेशा निजी सहायक विधियों के माध्यम से परीक्षण करें जो चूक का उपयोग करने की अनुमति नहीं देते हैं

    def _AlgoOne(n, publicParams):
        return AlgoOne(n, publicParams)

यकीन है कि उन विकल्पों में से कोई भी बहुत काम कर रहे हैं, लेकिन आप यह नहीं पूछेंगे कि क्या यह आपके लिए कोई समस्या नहीं थी।


0

कोई भी हमेशा वैश्विक संदर्भ और उन मापदंडों के प्रसंस्करण से मूल्यों के संग्रह को अलग कर सकता है।

def do_the_thing():
    """Provides the public (rather untestable) context.
    _do_the_thing(global1, global2, publicParams)"""

def _do_the_thing(blah, blah, blah):
    "Actually does the thing"
    pass
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.