2015-12-25 7 views
66

मैंने हाल ही में py.test खोजा है। यह बहुत अच्छा लगता है। हालांकि मुझे लगता है कि दस्तावेज़ीकरण बेहतर हो सकता है।py.test में, conftest.py फ़ाइलों का उपयोग क्या है?

मैं समझने की कोशिश कर रहा हूं कि conftest.py फ़ाइलों का उपयोग किस प्रकार किया जाना है।

मेरे (वर्तमान में छोटे) परीक्षण सूट में मेरे पास परियोजना रूट पर एक conftest.py फ़ाइल है। मैं इसे अपने परीक्षणों में इंजेक्ट करने वाले फिक्स्चर को परिभाषित करने के लिए उपयोग करता हूं।

मैं दो प्रश्न हैं:

  1. इस conftest.py के सही उपयोग है? क्या इसका अन्य उपयोग है?
  2. क्या मेरे पास एक से अधिक conftest.py फ़ाइल हो सकती है? मैं ऐसा कब करना चाहूंगा? उदाहरणों की सराहना की जाएगी।

अधिक आम तौर पर, आप एक py.test परीक्षण सूट में conftest.py फ़ाइल (ओं) के उद्देश्य और सही उपयोग को कैसे परिभाषित करेंगे?

उत्तर

107

इस conftest.py के सही उपयोग है (उस मामले में मैं उन्हें परीक्षण फ़ाइलों को सीधे में परिभाषित करने के लिए पसंद करते हैं)?

हां यह है, फिक्स्चर conftest.py का संभावित और सामान्य उपयोग है। फिक्स्चर जिन्हें आप परिभाषित करेंगे, आपके परीक्षण सूट में सभी परीक्षणों के बीच साझा किए जाएंगे। हालांकि रूट conftest.py में फिक्स्चर को परिभाषित करना बेकार हो सकता है और यदि परीक्षणों को सभी परीक्षणों द्वारा उपयोग नहीं किया जाता है तो यह परीक्षण धीमा कर देगा।

क्या इसका अन्य उपयोग है?

हां यह करता है।

  • फिक्स्चर: परीक्षण के द्वारा प्रयोग किया स्थिर डेटा के लिए जुड़नार को परिभाषित करें। निर्दिष्ट किए जाने तक सूट में सभी परीक्षणों द्वारा इस डेटा तक पहुंचा जा सकता है। यह डेटा के साथ-साथ मॉड्यूल के सहायक भी हो सकते हैं जो सभी परीक्षणों में पारित किए जाएंगे।

  • बाहरी प्लगइन लोडिंग: conftest.py का उपयोग बाहरी प्लगइन या मॉड्यूल आयात करने के लिए किया जाता है। निम्नलिखित वैश्विक चर को परिभाषित करके, pytest मॉड्यूल लोड करेगा और इसे अपने परीक्षण के लिए उपलब्ध कराएगा। प्लगइन्स आमतौर पर आपकी परियोजना या अन्य मॉड्यूल में परिभाषित फाइलें होती हैं जिन्हें आपके परीक्षणों में आवश्यक हो सकता है। आप here के रूप में पूर्वनिर्धारित प्लगइन का एक सेट भी लोड कर सकते हैं।

    pytest_plugins = "someapp.someplugin"

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

    def pytest_runtest_setup(item): 
        """ called before ``pytest_runtest_call(item). """ 
        #do some stuff` 
    
  • टेस्ट रूट पथ: यह एक छिपा सुविधा का एक सा है। अपने रूट पथ में conftest.py को परिभाषित करके, आपके पास pytestPYTHONPATH निर्दिष्ट किए बिना आपके एप्लिकेशन मॉड्यूल को पहचानने के लिए होगा। पृष्ठभूमि पर, py.test रूट 0 से पाए गए सभी submodules सहित sys.path संशोधित करता है।

मैं एक conftest.py फ़ाइल की तुलना में अधिक हो सकता है?

हां आप कर सकते हैं और इसकी परीक्षण संरचना किसी भी तरह जटिल होने पर दृढ़ता से अनुशंसा की जाती है। conftest.py फ़ाइलों में निर्देशिका का दायरा है, इसलिए लक्षित फिक्स्चर बनाने में मददगार और हेल्पर्स अच्छा अभ्यास है।

मैं ऐसा कब करना चाहूंगा? उदाहरणों की सराहना की जाएगी।

कई मामलों फिट सकता:

जड़/आधुनिक/conftest.py

def pytest_runtest_setup(item): 
    print("I am mod") 
    #do some stuff 


test root/mod2/test.py will NOT produce "I am mod" 

परीक्षण के एक विशेष समूह के लिए उपकरणों का एक सेट या हुक बनाना कुछ परीक्षणों के लिए फिक्स्चर का सेट लोड करें लेकिन दूसरों के लिए नहीं।

जड़/आधुनिक/conftest.py

@pytest.fixture() 
def fixture(): 
    return "some stuff" 

जड़/mod2/conftest.py

@pytest.fixture() 
def fixture(): 
    return "some other stuff" 

जड़/mod2/test.py

def test(fixture): 
    print(fixture) 

प्रिंट होगा "कुछ अन्य सामान"

अवहेलना हुक जड़ conftest.py

जड़/आधुनिक/conftest.py से विरासत में मिली

def pytest_runtest_setup(item): 
    print("I am mod") 
    #do some stuff 

जड़/conftest.py

def pytest_runtest_setup(item): 
    print("I am root") 
    #do some stuff 

root/mod के अंदर कोई भी परीक्षण चलाकर, केवल "मैं हूं" प्रिंट किया गया है।

आप conftest.pyhere के बारे में अधिक पढ़ सकते हैं।

संपादित करें:

क्या होगा यदि मैं सादे पुराने सहायक कार्यों अलग moduls में परीक्षण के एक नंबर से कहा जा करने की जरूरत है - वे अगर मैं उन्हें एक conftest में डाल मेरे लिए उपलब्ध हो जाएगा .py? या क्या मुझे उन्हें एक helpers.py मॉड्यूल में रखना चाहिए और आयात करना चाहिए और इसे अपने परीक्षण मॉड्यूल में उपयोग करना चाहिए?

आप अपने सहायकों को परिभाषित करने के लिए conftest.py का उपयोग कर सकते हैं, हालांकि आपको सामान्य अभ्यास का पालन करना चाहिए। सहायकों को कम से कम py.test में फिक्स्चर के रूप में उपयोग किया जा सकता है। उदाहरण के लिए मेरे परीक्षणों में मेरे पास एक नकली रेडिस सहायक है जिसे मैं इस तरह अपने परीक्षणों में इंजेक्ट करता हूं।

जड़/सहायक/redis/redis.py

@pytest.fixture 
def mock_redis(): 
    return MockRedis() 

जड़/परीक्षण/सामान/conftest.py

pytest_plugin="helper.redis.redis" 

जड़/परीक्षण/सामान/test.py

def test(mock_redis): 
    print(mock_redis.get('stuff')) 

यह एक परीक्षण मॉड्यूल होगा जिसे आप अपने परीक्षणों में स्वतंत्र रूप से आयात कर सकते हैं। नोट यदि आप redis.pyconftest.py के रूप में संभावित रूप से conftest.py नाम दे सकते हैं तो आपके मॉड्यूल redis में अधिक परीक्षण शामिल हैं। हालांकि अस्पष्टता के कारण यह अभ्यास निराश हो गया है।

यदि आप conftest.py का उपयोग करना चाहते हैं तो आप बस उस रूट को अपने रूट conftest.py में डाल सकते हैं और आवश्यकता होने पर इसे इंजेक्ट कर सकते हैं।

जड़/परीक्षण/conftest.py

@pytest.fixture 
def mock_redis(): 
    return MockRedis() 

जड़/परीक्षण/सामान/test.py

def test(mock_redis): 
    print(mock_redis.get(stuff)) 

एक और बात आप कर सकते हैं एक स्थापना योग्य प्लगइन लिखने के लिए है। उस स्थिति में आपका सहायक कहीं भी लिखा जा सकता है लेकिन इसे आपके और अन्य संभावित परीक्षण ढांचे में स्थापित करने के लिए एक प्रविष्टि बिंदु को परिभाषित करने की आवश्यकता है। this देखें।

यदि आप फिक्स्चर का उपयोग नहीं करना चाहते हैं, तो आप निश्चित रूप से एक साधारण सहायक को परिभाषित कर सकते हैं और जहां भी इसकी आवश्यकता हो, केवल पुराने पुराने आयात का उपयोग कर सकते हैं।

जड़/परीक्षण/सहायक/redis.py

class MockRedis(): 
    # stuff 

जड़/परीक्षण/सामान/test.py

from helper.redis import MockRedis 

def test(): 
    print(MockRedis().get(stuff)) 

हालांकि यहां आप पथ के बाद से साथ समस्याएं हो रही हों मॉड्यूल परीक्षण के एक बच्चे फ़ोल्डर में नहीं है।आप अपने सहायक को

जड़/परीक्षण/सहायक एक init जोड़कर इस (परीक्षण नहीं) पर काबू पाने के लिए सक्षम होना चाहिए/__ init__.py

from .redis import MockRedis 

या बस के लिए सहायक मॉड्यूल जोड़ने अपने PYTHONPATH

+0

क्या होगा यदि मुझे अलग-अलग मॉड्यूलस में कई परीक्षणों से बुलाए जाने वाले सादे-पुराने सहायक कार्यों की आवश्यकता होती है - क्या वे मुझे उपलब्ध होंगे अगर मैं उन्हें conftest.py में डालूं? या क्या मुझे बस उन्हें helpers.py मॉड्यूल में रखना चाहिए और इसे अपने परीक्षण मॉड्यूल में आयात और उपयोग करना चाहिए? –

+0

एक छोटा सा संपादन किया –

5

व्यापक अर्थ में conftest.py एक स्थानीय प्रति-निर्देशिका प्लगइन है। यहां आप निर्देशिका-विशिष्ट हुक और फिक्स्चर परिभाषित करते हैं। मेरे मामले में एक रूट निर्देशिका है जिसमें परियोजना विशिष्ट परीक्षण निर्देशिकाएं हैं। कुछ सामान्य जादू 'रूट' conftest.py में तैनात हैं। परियोजना विशिष्ट - अपने स्वयं में। कुछ भी conftest.py में जुड़नार भंडारण में बुरा नहीं देख सकता जब तक कि वे व्यापक रूप से इस्तेमाल नहीं कर रहे हैं

संबंधित मुद्दे