पाइस्टेस्ट में, कॉन्टेस्टस्टैडो फाइलों का उपयोग क्या है?


217

मुझे हाल ही में पता चला है pytest। बहुत अच्छा लग रहा है। हालांकि, मुझे लगता है कि प्रलेखन बेहतर हो सकता है।

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

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

मेरे दो सवाल हैं:

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

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


9
मेरे पास आप थेIt seems great. However, I feel the documentation could be better.
user9074332

7
हाँ, प्रलेखन इतना बेहतर हो सकता है। मैंने पूरे पाइटेस्ट डॉक्यूमेंटेशन को खोजा conftest.pyऔर हालाँकि इस चीज़ को करने के लिए या एक कॉन्टेस्ट फाइल के साथ उस चीज़ को करने के कई संदर्भ हैं, डॉक्यूमेंटेशन में कहीं भी यह संकेत नहीं देता है कि जब पाइस्टेस्ट टेस्ट की खोज करता है, तो सभी कॉन्टेस्टस्टेड फाइलें मिलीं (भीतर) निर्देशिका स्ट्रकुट्रे जिस पर परीक्षण खोज की जा रही है) परीक्षण संग्रह चरण (किसी भी परीक्षण चलने से पहले ) के दौरान चलाया जाएगा । यह पता लगाना था कि प्रयोग के माध्यम से खुद को।
डैनियल गोल्डफर्ब

जवाबों:


288

क्या यह conftest.py का सही उपयोग है?

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

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

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

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

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

    pytest_plugins = "someapp.someplugin"

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

    def pytest_runtest_setup(item):
         """ called before ``pytest_runtest_call(item). """
         #do some stuff`
  • टेस्ट रूट पथ : यह एक छिपी हुई विशेषता है। conftest.pyअपने रूट पथ में परिभाषित करके , आप pytestअपने एप्लिकेशन मॉड्यूल को निर्दिष्ट किए बिना पहचान लेंगे PYTHONPATH। पृष्ठभूमि में, py.test आपके 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, केवल "I am mod" मुद्रित होता है।

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

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

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

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

जड़ / सहायक / 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.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))

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

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

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

class MockRedis():
    # stuff

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

from helper.redis import MockRedis

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

हालाँकि, यहाँ आपको पथ की समस्या हो सकती है क्योंकि मॉड्यूल परीक्षण के एक बाल फ़ोल्डर में नहीं है। आपको __init__.pyअपने सहायक को जोड़कर इसे (परीक्षण नहीं) पर काबू पाने में सक्षम होना चाहिए

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

from .redis import MockRedis

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


मैं एक ऐसी स्थिति का सामना कर रहा हूं जिसमें मेरा पहला यूनिट टेस्ट मॉड्यूल, test_aaaaa.pyवास्तव में स्थिरता सेटअप पूरा होने से पहले चलाने का प्रयास कर रहा है conftest.py। यह क्यों हो सकता है के रूप में किसी भी विचार?
user9074332

Conftest.py के बिना, आपके परीक्षण रूट पथ को sys.path में जोड़ा नहीं जाता है, और आपको "ModuleNotFoundError: No मॉड्यूल '' foobar 'जैसी त्रुटियाँ दिखाई देंगी।
काले स्वीनी

11

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


10

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

हां , एक स्थिरता का उपयोग आमतौर पर कई परीक्षणों के लिए डेटा तैयार करने के लिए किया जाता है।

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

हां , एक फंक्शन एक ऐसा फंक्शन है जो pytestपहले और बाद में कभी-कभी वास्तविक टेस्ट फंक्शंस द्वारा चलाया जाता है। तयशुदा में कोड आप जो चाहें कर सकते हैं। उदाहरण के लिए, एक स्थिरता का उपयोग परीक्षणों पर काम करने के लिए एक डेटा सेट प्राप्त करने के लिए किया जा सकता है, या एक स्थिरता का उपयोग परीक्षण चलाने से पहले एक ज्ञात राज्य में एक प्रणाली प्राप्त करने के लिए भी किया जा सकता है।

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

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

दूसरा, हां , आपके पास conftest.pyशीर्ष परीक्षण निर्देशिका की उपनिर्देशिकाओं में अन्य फाइलें हो सकती हैं । यदि आप करते हैं, तो इन निम्न-स्तरीय conftest.pyफ़ाइलों में परिभाषित जुड़नार उस निर्देशिका और उपनिर्देशिकाओं में परीक्षण के लिए उपलब्ध होंगे।

अंत में, conftest.pyपरीक्षण रूट पर फ़ाइल में जुड़नार लगाने से उन्हें सभी परीक्षण फ़ाइलों में उपलब्ध हो जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.