একটি ইন সম্মত মন্তব্য করার জন্য গৃহীত উত্তর , জো জিজ্ঞেস করল:
কোনো উপায় আছে কনসোলে প্রিন্ট করতে হয় এবং আউটপুট গ্রহণ করে যাতে এটি junit প্রতিবেদনে দেখায়?
ইউনিক্স-এ এটি সাধারণত টিজিং হিসাবে পরিচিত । আদর্শভাবে, ক্যাপচারের পরিবর্তে টিং করা হবে পাইস্টেস্ট ডিফল্ট। অ আদর্শভাবে, তন্ন তন্ন py.test কিংবা কোনো বিদ্যমান তৃতীয় পক্ষের py.test প্লাগইন (... আমি এর যাহাই হউক না কেন জানি যে ) teeing সমর্থন - পাইথন সত্ত্বেও জাভাস্ক্রিপ্টে গার্বেজ teeing সমর্থনকারী -আউট এর-বক্স ।
অসমর্থিত যে কোনও কিছু করতে বানর-প্যাচিং পাই পাইস্ট অ-তুচ্ছ। কেন? কারণ:
- সর্বাধিক পাইস্টেস্ট কার্যকারিতা কোনও ব্যক্তিগত
_pytest
প্যাকেজের পিছনে লক থাকে যা বাহ্যিকভাবে আমদানি করার উদ্দেশ্যে নয় । আপনি সাধারণত যা করছেন তা না জেনেই তা করার চেষ্টা করা ফলাফল pytest
রানটাইমের সময় অস্পষ্ট ব্যতিক্রমগুলি উত্সাহিত করার জন্য পাবলিক প্যাকেজের ফলাফল । অনেক ধন্যবাদ, পাইস্টেস্ট। সত্যিই শক্তিশালী আর্কিটেকচার আপনি সেখানে পেয়েছেন।
- এমনকি যখন আপনি কি করতে কিভাবে বেসরকারী বানর-প্যাচ জিনিসটা
_pytest
নিরাপদ পদ্ধতিতে এপিআই, আপনি এখন যা করতে হবে আগে প্রকাশ্য চলমান pytest
বহিরাগত দ্বারা প্যাকেজ রান py.test
কমান্ড। আপনি এটি একটি প্লাগইনে (উদাহরণস্বরূপ, আপনার পরীক্ষার স্যুটে একটি শীর্ষ-স্তরের মডিউল) করতে পারবেন নাconftest
। দ্বারা সময় py.test প্রখর রৌদ্রে পরিবর্তনশীল আপনার প্লাগইন আমদানি কাছাকাছি পায়, কোনো py.test বর্গ আপনি বানর-প্যাচ চেয়েছিলেন দীর্ঘ থেকে instantiated হয়েছে - এবং আপনি কি না যে দৃষ্টান্ত এক্সেস আছে। এর থেকে বোঝা যায় যে আপনি যদি নিজের বানর-প্যাচটি অর্থবহভাবে প্রয়োগ করতে চান তবে আপনি বাহ্যিক py.test
আদেশটি আর নিরাপদে চালাতে পারবেন না । পরিবর্তে, আপনাকে কাস্টম সেটআপলগুলি দিয়ে সেই কমান্ডের চলমানটি মোড়তে হবেtest
কমান্ড যে (ক্রম):
- বানরটি ব্যক্তিগত
_pytest
এপিআইকে প্যাচ করে ।
- কমান্ডটি
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- এ এখন ক্যাপচার করা হবে। নিফটি!
উপরের বানর-প্যাচ টি স্টাডাউট এবং স্টডারকে প্রসারিত করা ফ্রি সময়ের ব্যারেল-পূর্ণ ব্যারেল সহ পাঠকের কাছে অনুশীলন হিসাবে ছেড়ে যায়।