পাইস্টে রান চলাকালীন আমি কীভাবে প্রিন্ট আউটপুট তৈরি দেখতে পাচ্ছি?


400

কখনও কখনও আমি আমার কোডটিতে কিছু মুদ্রণ বিবৃতি সন্নিবেশ করতে চাই এবং আমি যখন এটি ব্যবহার করি তখন কী মুদ্রিত হয়। "ব্যায়াম" করার আমার স্বাভাবিক উপায় এটি বিদ্যমান পাইস্ট টেস্টগুলির সাথে। তবে আমি যখন এগুলি চালনা করি তখন কোনও মানক আউটপুট (কমপক্ষে পাইচার্মের মধ্যে থেকে, আমার আইডিই) দেখতে পাবে না বলে মনে হচ্ছে।

পাইস্টেস্ট রান চলাকালীন স্ট্যান্ডার্ড আউটপুট দেখার কি কোনও সহজ উপায় আছে?


শুধু ব্যর্থতা বা সর্বদা?

17

3
@ ডেলান - আমি সর্বদা এটি দেখতে চাই
ডেস

উত্তর:


564

-sসুইচ প্রতি পরীক্ষা ক্যাপচারিং অক্ষম করে।


86
-s=--capture=no
hobs

ইউআরএল ভাঙা। সম্ভবত এটি একটিকে সহায়তা করবে: docs.pytest.org/en/latest/capture.html
কোড_ড্রেড

1
এর ফলে আউটপুটটি পাইস্ট আউটপুটটির সাথে আন্তঃবিবাহিত হয়। পাইয়েস্টের জন্য যা সম্ভবত আপনি চান তা হ'ল নিয়মিতভাবে আউটপুট ক্যাপচার করা এবং পরীক্ষাগুলি পাস করার সাথে সাথে ব্যর্থ হওয়ার সাথে সাথে এটি প্রদর্শন করা। দেখুন stackoverflow.com/a/59156707/369977
pR0Ps

51

একটি ইন সম্মত মন্তব্য করার জন্য গৃহীত উত্তর , জো জিজ্ঞেস করল:

কোনো উপায় আছে কনসোলে প্রিন্ট করতে হয় এবং আউটপুট গ্রহণ করে যাতে এটি junit প্রতিবেদনে দেখায়?

ইউনিক্স-এ এটি সাধারণত টিজিং হিসাবে পরিচিত । আদর্শভাবে, ক্যাপচারের পরিবর্তে টিং করা হবে পাইস্টেস্ট ডিফল্ট। অ আদর্শভাবে, তন্ন তন্ন py.test কিংবা কোনো বিদ্যমান তৃতীয় পক্ষের py.test প্লাগইন (... আমি এর যাহাই হউক না কেন জানি যে ) teeing সমর্থন - পাইথন সত্ত্বেও জাভাস্ক্রিপ্টে গার্বেজ teeing সমর্থনকারী -আউট এর-বক্স

অসমর্থিত যে কোনও কিছু করতে বানর-প্যাচিং পাই পাইস্ট অ-তুচ্ছ। কেন? কারণ:

  • সর্বাধিক পাইস্টেস্ট কার্যকারিতা কোনও ব্যক্তিগত _pytestপ্যাকেজের পিছনে লক থাকে যা বাহ্যিকভাবে আমদানি করার উদ্দেশ্যে নয় । আপনি সাধারণত যা করছেন তা না জেনেই তা করার চেষ্টা করা ফলাফল pytestরানটাইমের সময় অস্পষ্ট ব্যতিক্রমগুলি উত্সাহিত করার জন্য পাবলিক প্যাকেজের ফলাফল । অনেক ধন্যবাদ, পাইস্টেস্ট। সত্যিই শক্তিশালী আর্কিটেকচার আপনি সেখানে পেয়েছেন।
  • এমনকি যখন আপনি কি করতে কিভাবে বেসরকারী বানর-প্যাচ জিনিসটা _pytestনিরাপদ পদ্ধতিতে এপিআই, আপনি এখন যা করতে হবে আগে প্রকাশ্য চলমান pytestবহিরাগত দ্বারা প্যাকেজ রান py.testকমান্ড। আপনি এটি একটি প্লাগইনে (উদাহরণস্বরূপ, আপনার পরীক্ষার স্যুটে একটি শীর্ষ-স্তরের মডিউল) করতে পারবেন নাconftest । দ্বারা সময় py.test প্রখর রৌদ্রে পরিবর্তনশীল আপনার প্লাগইন আমদানি কাছাকাছি পায়, কোনো py.test বর্গ আপনি বানর-প্যাচ চেয়েছিলেন দীর্ঘ থেকে instantiated হয়েছে - এবং আপনি কি না যে দৃষ্টান্ত এক্সেস আছে। এর থেকে বোঝা যায় যে আপনি যদি নিজের বানর-প্যাচটি অর্থবহভাবে প্রয়োগ করতে চান তবে আপনি বাহ্যিক py.testআদেশটি আর নিরাপদে চালাতে পারবেন না । পরিবর্তে, আপনাকে কাস্টম সেটআপলগুলি দিয়ে সেই কমান্ডের চলমানটি মোড়তে হবেtest কমান্ড যে (ক্রম):
    1. বানরটি ব্যক্তিগত _pytestএপিআইকে প্যাচ করে ।
    2. কমান্ডটি pytest.main()চালানোর জন্য পাবলিক ফাংশনটি কল করে py.test

এই উত্তরটি বানর-প্যাচগুলি পাইস্টেস্টের -sএবং স্ট্যাডারকে --capture=noক্যাপচার করার বিকল্পগুলি কিন্তু স্টডআউট নয় । ডিফল্টরূপে, এই বিকল্পগুলি stderr বা stdout না ক্যাপচার করে। এটি অবশ্যই টিউনিং নয়। তবে প্রতিটি দুর্দান্ত যাত্রা এক ক্লান্তিকর প্রিক্যুল দিয়ে শুরু হয় প্রত্যেককে পাঁচ বছরে ভুলে যায়।

কেন এমন করবেন? আমি এখন আপনাকে বলব। আমার পাইস্টেস্ট-চালিত পরীক্ষা স্যুটে ধীর কার্যকরী পরীক্ষা রয়েছে। এই পরীক্ষাগুলির stdout প্রদর্শন সহায়ক এবং আশ্বাস দেয়, লাইটেকের কাছে পৌঁছানো থেকে রোধ করে killall -9 py.testযখন আরও দীর্ঘ-চলমান কার্যকরী পরীক্ষা কয়েক সপ্তাহ ধরে শেষ করতে ব্যর্থ হয়। এই পরীক্ষাগুলির stderr প্রদর্শিত, py.est পরীক্ষা ব্যর্থতা উপর ব্যতিক্রম ট্রেসব্যাকস প্রতিবেদন থেকে প্রতিরোধ করে। যা সম্পূর্ণ অপ্রয়োজনীয়। অতএব, আমরা স্টাইডারকে ক্যাপচার করতে পাইস্টেস্টকে বাধ্য করি কিন্তু স্টডআউট না

আমরা এটিতে পৌঁছানোর আগে, এই উত্তরটি ধরে নিয়েছে যে আপনার কাছে ইতিমধ্যে একটি কাস্টম সেটআপটোলস testকমান্ড রয়েছে যা পিওয়াইস্টকে আহ্বান করছে। যদি আপনি এটি না করেন তবে পাইস্টেস্টের সু-লিখিত ভাল অনুশীলন পৃষ্ঠাগুলির ম্যানুয়াল ইন্টিগ্রেশন সাবমেকশন দেখুন ।

পাইস্টেস্ট-রানার ইনস্টল করবেন না , তৃতীয় পক্ষের সেটআপটোলস প্লাগইন একটি কাস্টম সেটআপটুলস কমান্ড সরবরাহ করে যা পাই.য়েস্টকে অনুরোধ করে। যদি পাইস্টেস্ট-রানার ইতিমধ্যে ইনস্টল করা থাকে তবে আপনাকে সম্ভবত পাইপ 3 প্যাকেজটি আনইনস্টল করতে হবে এবং তারপরে উপরের সাথে লিঙ্কযুক্ত ম্যানুয়াল পদ্ধতি গ্রহণ করতে হবে।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)

এই বানর-প্যাচ সক্ষম করতে, পাই.স্টেস্টটি নিম্নরূপে চালান:

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
এটিই আমি আসল উত্তরটি খুঁজছিলাম! ধন্যবাদ. (Stdout- এ এসে পরে পরীক্ষার ফলাফল কাঙ্খিত করা হলে তারা ইন্টারলিভড্ হয়, মুদ্রিত লাইন মান হারান।।)
bossylobster

18

pytest -s -v test_login.pyকনসোলে আরও তথ্যের জন্য চেষ্টা করুন ।

-v এটি একটি সংক্ষিপ্ত --verbose

-s মানে 'সমস্ত ক্যাপচারিং অক্ষম করুন'




1
আপনি যদি পাইস্টেটিআইএনআই ফাইল ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন: addopts = -s -v পাইথন_ফায়ালস = পরীক্ষা_লগিন.পি
টিমজ 9

4

আপনি যদি পাইচার্ম আইডিই ব্যবহার করে থাকেন তবে আপনি সেই স্বতন্ত্র পরীক্ষাটি চালাতে পারেন বা রান সরঞ্জামদণ্ড ব্যবহার করে সমস্ত পরীক্ষা চালাতে পারেন। রান সরঞ্জাম উইন্ডোটি আপনার অ্যাপ্লিকেশন দ্বারা উত্পন্ন আউটপুট প্রদর্শন করে এবং আপনি পরীক্ষার আউটপুট অংশ হিসাবে সমস্ত মুদ্রণ বিবৃতি দেখতে পাবেন।


পরীক্ষা চলাকালীন কীভাবে পাইচর্ম প্রিন্ট করবেন তা আপনি জানেন? (পরীক্ষা শেষ হওয়ার পরিবর্তে)
আলেকজান্দ্রে হুয়াট

3

pytest --capture=tee-sysসম্প্রতি যুক্ত করা হয়েছে। আপনি ক্যাপচার পাশাপাশি stdout / err এ আউটপুট দেখতে পারেন।


-4

অন্য উত্তরগুলি কাজ করে না। শুধুমাত্র বন্দী আউটপুট দেখতে উপায় নিম্নলিখিত পতাকা ব্যবহার করছে:

পাইস্ট - শো-ক্যাপচার সব


6
--show-capture=allডিফল্ট মান। এটি যুক্ত করা কোনও প্রভাব ফেলবে না।
22-29 এ hoefling
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.