Pytest चलाने के दौरान मैं सामान्य प्रिंट आउटपुट कैसे देख सकता हूं?


400

कभी-कभी मैं अपने कोड में केवल कुछ प्रिंट स्टेटमेंट डालना चाहता हूं, और जब मैं इसे प्रयोग करता हूं तो प्रिंट आउट प्राप्त करता हूं। मेरा सामान्य तरीका "व्यायाम" करना है जो मौजूदा पाइस्टेस्ट परीक्षणों के साथ है। लेकिन जब मैं इन्हें चलाता हूं, तो मैं किसी भी मानक आउटपुट (कम से कम पाइकर्म, मेरी आईडीई के भीतर से) को नहीं देख पाता हूं।

पाइस्टेस्ट रन के दौरान मानक आउटपुट देखने का एक सरल तरीका है?


केवल असफलता पर या हमेशा?

17
-s प्रति परीक्षण कैप्चरिंग अक्षम करता है
hpk42

3
@delnan - मैं इसे हमेशा देखना चाहूंगा
Des

जवाबों:


564

-sस्विच प्रति-परीक्षण कैप्चरिंग अक्षम करता है।


86
-s=--capture=no
hobs

URL टूट गया है। शायद यह एक मदद करेगा: docs.pytest.org/en/latest/capture.html
code_dredd

1
यह आउटपुट को पाइस्टेस्ट आउटपुट के साथ इंटरलीव करने का कारण बनता है। आप शायद चाहते हैं कि पाइस्टेस्ट हमेशा की तरह आउटपुट को कैप्चर करे और जब टेस्ट पास हो जाए तो फेल हो जाए। देखें stackoverflow.com/a/59156707/369977
pR0Ps

51

स्वीकृत उत्तर के लिए एक टिप्पणी में , जो पूछता है:

क्या कंसोल पर प्रिंट करने और आउटपुट को कैप्चर करने का कोई तरीका है ताकि यह जूनियर रिपोर्ट में दिखाई दे?

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
    1. बंदर _pytestएपीआई निजी एपीआई।
    2. कमांड 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 अब कब्जा कर लिया जाएगा। निफ्टी!

उपरोक्त बंदर-पैच को टी-स्टडआउट तक पहुंचाने और स्टैडर को खाली समय के प्रति बैरल-पूर्ण के साथ पाठक को एक अभ्यास के रूप में छोड़ दिया जाता है।


33

परीक्षण चलाते समय -sविकल्प का उपयोग करें । exampletest.pyपरीक्षण चलाने पर सभी प्रिंट स्टेटमेंट कंसोल पर प्रिंट हो जाते हैं।

py.test exampletest.py -s

31

पाइटेस्ट डॉक्यूमेंटेशन के अनुसार, पाइस्टेस्ट का संस्करण 3 एक परीक्षण में अस्थायी रूप से अक्षम कर सकता है:

def test_disabling_capturing(capsys):
    print('this output is captured')
    with capsys.disabled():
        print('output not captured, going directly to sys.stdout')
    print('this output is also captured')

20

पाइस्टेस्ट व्यक्तिगत परीक्षणों से स्टैडआउट को पकड़ लेता है और उन्हें केवल कुछ शर्तों पर प्रदर्शित करता है, साथ ही परीक्षणों के सारांश के साथ यह डिफ़ॉल्ट रूप से प्रिंट करता है।

अतिरिक्त सारांश जानकारी को '-r' विकल्प का उपयोग करके दिखाया जा सकता है:

pytest -rP

पारित परीक्षणों के कब्जे वाले उत्पादन को दर्शाता है।

pytest -rx

विफल परीक्षणों (डिफ़ॉल्ट व्यवहार) के कैप्चर किए गए आउटपुट को दिखाता है।

आउटपुट का स्वरूपण, -s के साथ -r के साथ प्राथमिक है।


2
यह वास्तविक उत्तर है जिसकी मुझे तलाश थी! धन्यवाद। (स्टडआउट आने के बाद परीक्षण के परिणाम वांछित हैं। जब वे
इंटरलेव

18

pytest -s -v test_login.pyकंसोल में अधिक जानकारी के लिए प्रयास करें ।

-v यह छोटा है --verbose

-s का अर्थ है 'सभी कैप्चरिंग को अक्षम करें'




1
अगर आप pytest.ini फ़ाइल का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं: addopts = -s -v python_files = test_login.py
timj98

4

यदि आप PyCharm IDE का उपयोग कर रहे हैं, तो आप उस व्यक्तिगत परीक्षण या रन टूलबार का उपयोग करके सभी परीक्षण चला सकते हैं। रन टूल विंडो आपके एप्लिकेशन द्वारा उत्पन्न आउटपुट प्रदर्शित करता है और आप परीक्षण आउटपुट के भाग के रूप में सभी प्रिंट स्टेटमेंट देख सकते हैं।


क्या आप जानते हैं कि टेस्ट चलने के दौरान PyCharm प्रिंट कैसे बनाते हैं? (परीक्षण बीतने के बाद के बजाय)
एलेक्जेंडर ह्यूट

3

pytest --capture=tee-sysहाल ही में जोड़ा गया था। आप stdout / इरेट पर आउटपुट को देखने के साथ-साथ कैप्चर कर सकते हैं।


-4

अन्य जवाब काम नहीं करते। कैप्चर किए गए आउटपुट को देखने का एकमात्र तरीका निम्न ध्वज का उपयोग करना है:

pytest --show-कब्जा सभी


6
--show-capture=allडिफ़ॉल्ट मान है। इसे जोड़ने से कुछ भी प्रभावित नहीं होता है।
फहराना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.