পাইস্টে কনসোলে কীভাবে প্রিন্ট করবেন?


175

আমি টিডিডি (পরীক্ষা চালিত বিকাশ) এর সাথে ব্যবহার করার চেষ্টা করছি pytest। আমি যখন ব্যবহার করি তখন কনসোলটিতে pytestযাব না ।printprint

আমি pytest my_tests.pyএটি চালানোর জন্য ব্যবহার করছি ।

documentation: যদি বলা হয় যে এটি ডিফল্ট দ্বারা কাজ করা উচিত বলে মনে হয় http://pytest.org/latest/capture.html

কিন্তু:

import myapplication as tum

class TestBlogger:

    @classmethod
    def setup_class(self):
        self.user = "alice"
        self.b = tum.Blogger(self.user)
        print "This should be printed, but it won't be!"

    def test_inherit(self):
        assert issubclass(tum.Blogger, tum.Site)
        links = self.b.get_links(posts)
        print len(links)   # This won't print either.

আমার স্ট্যান্ডার্ড আউটপুট কনসোলে কিছুই মুদ্রিত হয় না (কেবলমাত্র সাধারণ অগ্রগতি এবং কতগুলি পরীক্ষায় পাস / ব্যর্থ হয়েছে)।

এবং আমি যে স্ক্রিপ্টটি পরীক্ষা করছি তাতে মুদ্রণ রয়েছে:

class Blogger(Site):
    get_links(self, posts):
        print len(posts)   # It won't get printed in the test.

ইন unittestমডিউল, সবকিছু ডিফল্ট ভাবে মুদ্রিত পরার, যা আমি ঠিক কি প্রয়োজন। তবে আমি pytestঅন্য কারণে ব্যবহার করতে চাই ।

কেউ কী কীভাবে মুদ্রণ বিবৃতি প্রদর্শিত হবে তা জানেন?


1
সম্ভবত স্টডআউট ওভাররাইট করা হচ্ছে। আপনি যদি ব্যবহার করেন তবে কী হবে sys.stdout.write("Test")? কীভাবে sys.__stdout__.write("Test")? পরেরটি সর্বদা সিস্টেম-সংজ্ঞায়িত stdout এ লিখতে হবে যা কনসোল হওয়া উচিত। যদি দুটি কমান্ড আলাদা আলাদা জিনিস করে, তবে স্টাডাউট পরিবর্তন করা হচ্ছে; যদি তারা একই কাজ করে তবে সমস্যাটি অন্যরকম।
TheSoundDifense

উত্তর:


205

ডিফল্টরূপে, py.testস্ট্যান্ডার্ডের ফলাফলটি ক্যাপচার করে যাতে এটি কীভাবে এটি প্রিন্ট করে তা নিয়ন্ত্রণ করতে পারে। যদি এটি এটি না করে, এটি কোনও পাঠ্য কী টেস্টটি প্রিন্ট করেছে তা প্রসঙ্গে ছাড়াই প্রচুর পাঠ্য বানিয়ে ফেলবে।

তবে, যদি কোনও পরীক্ষা ব্যর্থ হয়, তবে ফলাফলের প্রতিবেদনে এটি এমন একটি অংশ অন্তর্ভুক্ত করবে যা দেখায় যে নির্দিষ্ট পরীক্ষায় স্ট্যান্ডার্ড আউট কী প্রিন্ট করা হয়েছিল।

উদাহরণ স্বরূপ,

def test_good():
    for i in range(1000):
        print(i)

def test_bad():
    print('this should fail!')
    assert False

নিম্নলিখিত ফলাফলের ফলাফল:

>>> py.test tmp.py
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items

tmp.py .F

=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________

    def test_bad():
        print('this should fail!')
>       assert False
E       assert False

tmp.py:7: AssertionError
------------------------------- Captured stdout --------------------------------
this should fail!
====================== 1 failed, 1 passed in 0.04 seconds ======================

Captured stdoutবিভাগটি নোট করুন ।

যদি আপনি printবিবৃতিগুলি কার্যকর করা হয় দেখতে চান তবে আপনি -sপতাকাটি এতে পাস করতে পারেন py.test। তবে নোট করুন যে এটি পার্স করা কখনও কখনও কঠিন হতে পারে।

>>> py.test tmp.py -s
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items

tmp.py 0
1
2
3
... and so on ...
997
998
999
.this should fail!
F

=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________

    def test_bad():
        print('this should fail!')
>       assert False
E       assert False

tmp.py:7: AssertionError
====================== 1 failed, 1 passed in 0.02 seconds ======================

2
বিশিষ্ট ব্যবহারিক। দারূন কাজ!
সেমিসি

1
হুম ... এখনও আমার মুদ্রণ বিবৃতি লগ করতে পারে না
টিম বোল্যান্ড

68

-sবিকল্পটি ব্যবহার করা সমস্ত ফাংশনের আউটপুট মুদ্রণ করবে, যা খুব বেশি হতে পারে।

আপনার যদি নির্দিষ্ট আউটপুট দরকার হয় তবে আপনি যে ডক পৃষ্ঠাটি উল্লেখ করেছেন তাতে কয়েকটি প্রস্তাব দেওয়া হয়:

  1. assert False, "dumb assert to make PyTest print my stuff"আপনার ফাংশন শেষে In োকান, এবং ব্যর্থ পরীক্ষার কারণে আপনি আপনার আউটপুট দেখতে পাবেন।

  2. পাইটেষ্টের কাছে আপনার কাছে বিশেষ অবজেক্টটি পৌঁছেছে এবং পরে এটি পরীক্ষা করতে আপনি কোনও ফাইলের মধ্যে আউটপুট লিখতে পারেন, পছন্দ করুন

    def test_good1(capsys):
        for i in range(5):
            print i
        out, err = capsys.readouterr()
        open("err.txt", "w").write(err)
        open("out.txt", "w").write(out)
    

    আপনি পৃথক ট্যাবে ফাইলগুলি outএবং errফাইলগুলি খুলতে পারেন এবং সম্পাদকটি আপনার জন্য এটি স্বয়ংক্রিয়ভাবে রিফ্রেশ করতে দেয় বা py.test; cat out.txtআপনার পরীক্ষা চালানোর জন্য একটি সাধারণ শেল কমান্ড করতে পারে।

এটি স্টাফ করার পরিবর্তে হ্যাকিশ উপায়, তবে এটি আপনার প্রয়োজনীয় জিনিসগুলি হতে পারে: সর্বোপরি, টিডিডি মানে আপনি স্টাফ নিয়ে গন্ডগোল করেন এবং প্রস্তুত হওয়ার সময় এটি পরিষ্কার এবং নীরব রেখে যান :-)।


আমি pytest 3.8.1 সঙ্গে সংস্করণ 1. চেষ্টা দুর্ভাগ্যবশত এটা শুধুমাত্র পরীক্ষা ফাংশন ব্লক ছাপে, কিন্তু মুদ্রণ বিবৃতি থেকে নয় আউটপুট :( আর এই জন্য ঠাট?
এই UV-

@ ইউভি - print()ফাংশনটি ব্যবহার করার পরিবর্তে, দৃsert় বিবৃতিতে কমাতে মুদ্রণের পরে আপনি যে পরিবর্তনশীল বা বার্তাটি মুদ্রণ করতে চান তার উচিত । যেমন পাইস্ট রিপোর্টে assert False, what_are_youএর মান 'প্রিন্ট আউট' করবে what_are_you
মার্ট ভ্যান ডি ভেন

43

সংক্ষিপ্ত উত্তর

-sবিকল্পটি ব্যবহার করুন :

pytest -s

বিস্তারিত উত্তর

ডক্স থেকে :

পরীক্ষার প্রয়োগের সময় stdout এবং stderr এ প্রেরিত যে কোনও আউটপুট ধরা পড়ে। যদি কোনও পরীক্ষা বা কোনও সেটআপ পদ্ধতি ব্যর্থ হয় তবে তার অনুসারে ক্যাপচার আউটপুটটি ব্যর্থতা ট্রেসব্যাকের পাশাপাশি প্রদর্শিত হবে।

pytestবিকল্প থাকে --capture=method, যা method: প্রতি পরীক্ষার পদ্ধতি ক্যাপচার, এবং নিম্নলিখিত এক হতে পারে fd, sysবা nopytestএছাড়াও -sএকটি বিকল্প রয়েছে যা এর জন্য একটি শর্টকাট --capture=no, এবং এটি বিকল্প যা আপনাকে কনসোলে আপনার মুদ্রণ বিবৃতিগুলি দেখতে দেয়।

pytest --capture=no     # show print statements in console
pytest -s               # equivalent to previous command

ক্যাপচার পদ্ধতি সেট করা বা ক্যাপচারিং অক্ষম করা

দুটি উপায় যা pytestক্যাপচারিং সম্পাদন করতে পারে:

  1. ফাইল বর্ণনাকারী (এফডি) স্তর ক্যাপচারিং (ডিফল্ট): অপারেটিং সিস্টেমের ফাইল বর্ণনাকারী 1 এবং 2 এ যাবত সমস্ত লেখাগুলি ক্যাপচার করা হবে।

  2. sys স্তর ক্যাপচারিং : কেবল পাইথন ফাইলগুলিতে sys.stdout লিখে sys.stderr ক্যাপচার করা হবে। ফাইলডিসিপেক্টরগুলিতে লেখার কোনও ক্যাপচারিং সম্পন্ন হয় না।

pytest -s            # disable all capturing
pytest --capture=sys # replace sys.stdout/stderr with in-mem files
pytest --capture=fd  # also point filedescriptors 1 and 2 to temp file

17

PyTestআক্ষরিক সব কিছু নিঃশব্দ করাতে গেলে এড়িয়ে যাওয়া পরীক্ষাগুলি সম্পর্কে আমার গুরুত্বপূর্ণ সতর্কতা মুদ্রণ করা দরকার ।

আমি সিগন্যাল প্রেরণে কোনও পরীক্ষায় ফেল করতে চাইনি, তাই আমি নিম্নলিখিত হিসাবে একটি হ্যাক করেছি:

def test_2_YellAboutBrokenAndMutedTests():
    import atexit
    def report():
        print C_patch.tidy_text("""
In silent mode PyTest breaks low level stream structure I work with, so
I cannot test if my functionality work fine. I skipped corresponding tests.
Run `py.test -s` to make sure everything is tested.""")
    if sys.stdout != sys.__stdout__:
        atexit.register(report)

atexitমডিউল আমাকে কাপড় মুদ্রণের মঞ্জুরি দেয় পর PyTest আউটপুট স্ট্রিম মুক্তি। আউটপুট নিম্নলিখিত হিসাবে দেখায়:

============================= test session starts ==============================
platform linux2 -- Python 2.7.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /media/Storage/henaro/smyth/Alchemist2-git/sources/C_patch, inifile: 
collected 15 items 

test_C_patch.py .....ssss....s.

===================== 10 passed, 5 skipped in 0.15 seconds =====================
In silent mode PyTest breaks low level stream structure I work with, so
I cannot test if my functionality work fine. I skipped corresponding tests.
Run `py.test -s` to make sure everything is tested.
~/.../sources/C_patch$

PyTestসাইলেন্ট মোডে থাকা অবস্থায়ও বার্তাটি মুদ্রিত হয় এবং আপনি যদি স্টাফ চালান তবে মুদ্রণ করা হয় নাpy.test -s , তাই ইতিমধ্যে সবকিছু সুন্দরভাবে পরীক্ষা করা হয়েছে।


1
কাস্টম পরীক্ষা মেট্রিক আউটপুট জন্য উপযুক্ত।
z0r

5

মতে pytest ডক্স , pytest --capture=sysকাজ করা উচিত। আপনি যদি কোনও পরীক্ষার অভ্যন্তরে স্ট্যান্ডার্ড ক্যাপচার করতে চান তবে ক্যাপসিস ফিক্সচারটি দেখুন।


টার্মিনালে মুদ্রণ পরিবর্তনকের প্রয়োজন যখন এটি আমার পক্ষে ...
সুকমা সাপুত্র

2

আমি PyTestসেখান থেকে ইউনিট পরীক্ষা চালানোর / ডিবাগ করার সময় ভিএসকোডের কনসোলে কীভাবে প্রিন্ট তৈরি করতে পারি তা জানতে এখানে এসেছি । নিম্নলিখিত launch.jsonকনফিগারেশন দিয়ে এটি করা যেতে পারে । প্রদত্ত .venvভার্চুয়াল পরিবেশ ফোল্ডার।

    "version": "0.2.0",
    "configurations": [
        {
            "name": "PyTest",
            "type": "python",
            "request": "launch",
            "stopOnEntry": false,
            "pythonPath": "${config:python.pythonPath}",
            "module": "pytest",
            "args": [
                "-sv"
            ],
            "cwd": "${workspaceRoot}",
            "env": {},
            "envFile": "${workspaceRoot}/.venv",
            "debugOptions": [
                "WaitOnAbnormalExit",
                "WaitOnNormalExit",
                "RedirectOutput"
            ]
        }
    ]
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.