क्या यह 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
।
It seems great. However, I feel the documentation could be better.