स्वीकृत उत्तर के लिए एक टिप्पणी में , जो पूछता है:
क्या कंसोल पर प्रिंट करने और आउटपुट को कैप्चर करने का कोई तरीका है ताकि यह जूनियर रिपोर्ट में दिखाई दे?
UNIX में, इसे आमतौर पर टीइंग के रूप में जाना जाता है । आदर्श रूप से, कैप्चरिंग के बजाय टीइंग py.test डिफ़ॉल्ट होगा। नॉन-आइडियल, न तो py.test और न ही कोई मौजूदा थर्ड-पार्टी py.test प्लगइन (... जो मुझे पता है, वैसे भी ) तीज का समर्थन करता है - बावजूद Python तुच्छ आउट-ऑफ-द-बॉक्स का समर्थन करता है ।
बंदर-चिढ़ा py.test कुछ भी असमर्थित करने के लिए गैर-तुच्छ है। क्यों? चूंकि:
- अधिकांश py.test कार्यक्षमता को एक निजी
_pytest
पैकेज के पीछे बंद किया जाता है जिसका इरादा बाहरी रूप से आयात नहीं किया जाता है। ऐसा करने का प्रयास किए बिना यह जानना कि आप आमतौर पर सार्वजनिक pytest
पैकेज में क्या परिणाम कर रहे हैं , रनटाइम पर अस्पष्ट अपवाद बढ़ाते हैं। बहुत बहुत धन्यवाद, py.test वास्तव में मजबूत वास्तुकला आपको वहां मिली।
- यहां तक कि जब आप करते हैं कि कैसे करने के लिए निजी बंदर-पैच बाहर आंकड़ा
_pytest
एक सुरक्षित तरीके से एपीआई, तो आप ऐसा करने के लिए है से पहले सार्वजनिक चल pytest
बाहरी द्वारा पैकेज रन py.test
कमांड। आप इसे एक प्लगइन में नहीं कर सकते हैं (उदाहरण के लिए, conftest
आपके परीक्षण सूट में एक शीर्ष-स्तरीय मॉड्यूल)। जब तक py.test lazily अपने प्लगइन को गतिशील रूप से आयात करने के लिए चारों ओर हो जाता है, तब तक आप जिस भी py.test क्लास को मंकी-पैच करना चाहते थे, उसे तुरंत शुरू कर दिया गया है - और आप कमांड (क्रम में) करते हैं:
नहीं हैं उस उदाहरण तक पहुंच है। इसका मतलब यह है कि, यदि आप अपने बंदर-पैच को सार्थक रूप से लागू करना चाहते हैं, तो आप बाहरी py.test
कमांड को सुरक्षित रूप से नहीं चला सकते । इसके बजाए, आपको उस कमांड को कस्टम सेटप्टूल से लपेटना होगाtest
- बंदर
_pytest
एपीआई निजी एपीआई।
- कमांड
pytest.main()
चलाने के लिए सार्वजनिक फ़ंक्शन को कॉल करता है py.test
।
यह उत्तर बंदर-पैच py.test का है -s
और स्टैडर --capture=no
पर कब्जा करने का विकल्प है, लेकिन स्टडआउट नहीं । डिफ़ॉल्ट रूप से, ये विकल्प न तो stderr और न ही stdout कैप्चर करते हैं। यह बिल्कुल टीइंग नहीं है। लेकिन हर महान यात्रा एक थकाऊ प्रीक्वेल के साथ शुरू होती है जो हर कोई पांच साल में भूल जाता है।
यह क्यों? अब मैं आपको बताता हूँ। मेरे py.test द्वारा संचालित परीक्षण सूट में धीमी गति से कार्यात्मक परीक्षण शामिल हैं। इन परीक्षणों के स्टडआउट को प्रदर्शित करना सहायक और आश्वस्त करना है, लेईस्क को killall -9 py.test
तब तक पहुंचने से रोकना जब तक कि एक और लंबे समय तक चलने वाला कार्यात्मक परीक्षण अंत में हफ्तों तक कुछ भी करने में विफल रहता है। हालाँकि, इन परीक्षणों के स्टैडर को प्रदर्शित करना, py.test को परीक्षण विफलताओं पर अपवाद ट्रेसबैक को रिपोर्ट करने से रोकता है। जो पूरी तरह से अनहेल्दी है। इसलिए, हम styrr पर कब्जा करने के लिए py.test का उपयोग करते हैं लेकिन stdout नहीं ।
इससे पहले कि हम इसे प्राप्त करते हैं, यह उत्तर मानता है कि आपके पास पहले से ही एक कस्टम सेटपूल test
कमांड है जो py.test को आमंत्रित कर रहा है। यदि आप नहीं करते हैं, तो py.test के अच्छी तरह से लिखे गए अच्छे आचरण पृष्ठ के मैनुअल एकीकरण उपधारा देखें ।
पाइस्टेस्ट-रनर को स्थापित न करें , एक कस्टम-सेटटूलपूल कमांड प्रदान करने वाला एक तृतीय-पक्ष सेटपूलो प्लग भी py.test को आमंत्रित करता है। यदि पाइस्टेस्ट-रनर पहले से स्थापित है, तो आपको संभवतः उस pip3 पैकेज को अनइंस्टॉल करना होगा और फिर ऊपर दिए गए मैनुअल दृष्टिकोण को अपनाना होगा।test
मान लिया गया कि आपने ऊपर दिए गए मैन्युअल एकीकरण में निर्देशों का पालन किया है, आपके कोडबेस में अब एक PyTest.run_tests()
विधि होनी चाहिए । इस पद्धति को संशोधित करने के लिए:
class PyTest(TestCommand):
.
.
.
def run_tests(self):
# Import the public "pytest" package *BEFORE* the private "_pytest"
# package. While importation order is typically ignorable, imports can
# technically have side effects. Tragicomically, that is the case here.
# Importing the public "pytest" package establishes runtime
# configuration required by submodules of the private "_pytest" package.
# The former *MUST* always be imported before the latter. Failing to do
# so raises obtuse exceptions at runtime... which is bad.
import pytest
from _pytest.capture import CaptureManager, FDCapture, MultiCapture
# If the private method to be monkey-patched no longer exists, py.test
# is either broken or unsupported. In either case, raise an exception.
if not hasattr(CaptureManager, '_getcapture'):
from distutils.errors import DistutilsClassError
raise DistutilsClassError(
'Class "pytest.capture.CaptureManager" method _getcapture() '
'not found. The current version of py.test is either '
'broken (unlikely) or unsupported (likely).'
)
# Old method to be monkey-patched.
_getcapture_old = CaptureManager._getcapture
# New method applying this monkey-patch. Note the use of:
#
# * "out=False", *NOT* capturing stdout.
# * "err=True", capturing stderr.
def _getcapture_new(self, method):
if method == "no":
return MultiCapture(
out=False, err=True, in_=False, Capture=FDCapture)
else:
return _getcapture_old(self, method)
# Replace the old with the new method.
CaptureManager._getcapture = _getcapture_new
# Run py.test with all passed arguments.
errno = pytest.main(self.pytest_args)
sys.exit(errno)
इस बंदर-पैच को सक्षम करने के लिए, py.test को निम्नानुसार चलाएं:
python setup.py test -a "-s"
Stderr लेकिन नहीं stdout अब कब्जा कर लिया जाएगा। निफ्टी!
उपरोक्त बंदर-पैच को टी-स्टडआउट तक पहुंचाने और स्टैडर को खाली समय के प्रति बैरल-पूर्ण के साथ पाठक को एक अभ्यास के रूप में छोड़ दिया जाता है।