इस 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
को परिभाषित करके, आपके पास pytest
PYTHONPATH
निर्दिष्ट किए बिना आपके एप्लिकेशन मॉड्यूल को पहचानने के लिए होगा। पृष्ठभूमि पर, 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.py
here के बारे में अधिक पढ़ सकते हैं।
संपादित करें:
क्या होगा यदि मैं सादे पुराने सहायक कार्यों अलग 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.py
conftest.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
।
क्या होगा यदि मुझे अलग-अलग मॉड्यूलस में कई परीक्षणों से बुलाए जाने वाले सादे-पुराने सहायक कार्यों की आवश्यकता होती है - क्या वे मुझे उपलब्ध होंगे अगर मैं उन्हें conftest.py में डालूं? या क्या मुझे बस उन्हें helpers.py मॉड्यूल में रखना चाहिए और इसे अपने परीक्षण मॉड्यूल में आयात और उपयोग करना चाहिए? –
एक छोटा सा संपादन किया –