পাইথনে ইউনিট পরীক্ষার জন্য কীভাবে বিশ্বব্যাপী প্যারামিটারগুলি সঠিকভাবে পরিচালনা করবেন?


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কিছু অ্যালগরিদম কল করার সময় ডিফল্ট মান প্রদান এটি alচ্ছিক করে তোলে। তবে এর AlgoTwoমধ্যে থেকে কল করার সময় এটি পাস করা ভুলে যাওয়া সহজ হয়ে যায় AlgoOne, যার ফলে পরীক্ষার বস্তুটি পাস করা হলে দুটি পৃথক অবজেক্ট ব্যবহার করা হবেAlgoOne

আরও ভাল উপায় আছে যা ঝুঁকিপূর্ণ কম তবে এখনও ইউনিট পরীক্ষার জন্য নমনীয়তা সরবরাহ করে? এটি কি সত্যিই সেরা অনুশীলন?

উত্তর:


1

কনফিগারেশন ফাইল test_config.pyএবং production_config.py। এনভায়রনমেন্ট ভেরিয়েবল বা কমান্ড-লাইন আর্গুমেন্ট ব্যবহার করে তাদের মধ্যে একটি নির্বাচন করুন। এটি আমদানি করুন (বা পড়ুন / পার্স করুন, যদি আপনি .json/ এর .txtপরিবর্তে চয়ন করেন .py), এবং ফলাফলটি পুরো প্রোগ্রামটিতে একটি মডিউলে গ্লোবাল অবজেক্টের মাধ্যমে উপলভ্য করুন যা আপনি যে কোনও জায়গায় আমদানি করতে পারবেন।

এটি ইতিমধ্যে আপনি যা করছেন এর সাথে খুব মিল, বৈশ্বিক সুযোগ থেকে শুরু করে শেল যেখান থেকে আপনি অজগরকে ডাকেন তা এটি আরও এক ধাপ এগিয়ে নিয়ে যায়। সুবিধাটি হ'ল দুর্ঘটনাক্রমে উত্পাদন এবং পরীক্ষার কনফিগারেশন মিশ্রিত করার ঝুঁকি আর নেই: আপনি একই পাইথন সেশনে দুটি ফাইলই পড়তে পারবেন না, যেহেতু কেবলমাত্র একটি পরিবেশের পরিবর্তনশীল / কমান্ড লাইন রয়েছে।


0

আপনি করতে পারেন এমন অনেকগুলি জিনিস রয়েছে।

  • গ্লোবাল ব্যবহার বন্ধ করুন
  • ডিফল্ট ব্যবহার বন্ধ করুন
  • সর্বদা বেসরকারী সহায়ক পদ্ধতিগুলির মাধ্যমে পরীক্ষা করুন যা ডিফল্টগুলি ব্যবহারের অনুমতি দেয় না

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

নিশ্চিত যে এই বিকল্পগুলির মধ্যে যে কোনও একটি অনেক কাজ, তবে আপনি যদি জিজ্ঞাসা করবেন না এটি আপনার জন্য সমস্যা না ছিল।


0

বৈশ্বিক প্রসঙ্গ এবং para পরামিতিগুলির প্রক্রিয়াকরণ থেকে কেউ সর্বদা মান সংগ্রহকে পৃথক করতে পারে separate

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