পাইস্টেস্ট পরীক্ষার মধ্যে লগিং


94

আমি কিছু স্টেট ভেরিয়েবল পরীক্ষা করতে পরীক্ষার জন্য কিছু লগিং স্টেটমেন্ট রাখতে চাই।

আমার কাছে নিম্নলিখিত কোড স্নিপেট রয়েছে:

import pytest,os
import logging

logging.basicConfig(level=logging.DEBUG)
mylogger = logging.getLogger()

#############################################################################

def setup_module(module):
    ''' Setup for the entire module '''
    mylogger.info('Inside Setup')
    # Do the actual setup stuff here
    pass

def setup_function(func):
    ''' Setup for test functions '''
    if func == test_one:
        mylogger.info(' Hurray !!')

def test_one():
    ''' Test One '''
    mylogger.info('Inside Test 1')
    #assert 0 == 1
    pass

def test_two():
    ''' Test Two '''
    mylogger.info('Inside Test 2')
    pass

if __name__ == '__main__':
    mylogger.info(' About to start the tests ')
    pytest.main(args=[os.path.abspath(__file__)])
    mylogger.info(' Done executing the tests ')

আমি নিম্নলিখিত আউটপুট পেতে:

[bmaryada-mbp:/Users/bmaryada/dev/platform/main/proto/tests/tpch $]python minitest.py
INFO:root: About to start the tests 
======================================================== test session starts =========================================================
platform darwin -- Python 2.6.2 -- pytest-2.0.0
collected 2 items 

minitest.py ..

====================================================== 2 passed in 0.01 seconds ======================================================
INFO:root: Done executing the tests 

লক্ষ্য করুন যে '__name__ == __main__'ব্লক থেকে কেবল লগিং বার্তাগুলি কনসোলে স্থানান্তরিত হয়।

pytestপরীক্ষার পদ্ধতিগুলি থেকে কনসোলে লগিংকে নিঃসরণ করার জন্য বল প্রয়োগ করার কোনও উপায় আছে কি ?


4
আপনি এই উত্তরটি একবার দেখে নিতে পারেন , পাইস্টেস্টের নির্মাতা পোস্ট করেছেন। তিনি একটি পাইস্টেস্ট প্লাগইন প্রস্তাব করেন যা উচ্চতর ডিগ্রি বহুমুখিতা সরবরাহ করে।
chb

উত্তর:


30

আমার জন্য কাজ করে, আমি যে আউটপুটটি পাই তা এখানে: [স্নিপ -> উদাহরণটি ভুল ছিল]

সম্পাদনা: দেখে মনে হচ্ছে আপনাকে -sপাইস্টেস্ট করার বিকল্পটি পাস করতে হবে যাতে এটি স্টডআউট ক্যাপচার করবে না। এখানে (পাইস্টেস্ট ইনস্টল করা হয়নি) এটি ব্যবহারের জন্য যথেষ্ট ছিল python pytest.py -s pyt.py

আপনার কোড জন্য, সব আপনি প্রয়োজন পাস হয় -sargsথেকে main:

 pytest.main(args=['-s', os.path.abspath(__file__)])

আউটপুট ক্যাপচার করার জন্য পাইস্টেস্ট ডকুমেন্টেশন দেখুন ।


দুঃখিত আমি তাড়াহুড়া করে কোডটি পেস্ট করেছি। 'সমস্যা' লক্ষ্য করার জন্য দয়া করে 'টেস্ট_নে' ফাংশন থেকে 'দাবী 0 == 1' সরান। কেবলমাত্র যখন কিছু ব্যর্থতা থাকে (যা আমি একটি মিথ্যা দাবী করে বাধ্য করেছি), পাইস্টেস্ট লগিংয়ের তথ্য মুদ্রণ করে বলে মনে হয়।
সুপারভাইলেটার

কোনও সমস্যা নেই, আমি কীভাবে কমান্ড লাইনে ফিক্স করতে হবে তা জানতে পেরেছিলাম, একটি প্রোগ্রামের উপায় খুঁজছি।
TryPyPy

4
আপনি লগিং আউটপুটটিকে কোনও ফাইলে ডিফল্ট অন্তর্ভুক্ত স্টাডারের পরিবর্তে পুনর্নির্দেশ করতে পারেন could
hpk42

@ সুপারসিলেক্টর এইচপি কে 42 হলেন পাই.স্টেস্ট লোক, শুনুন না। আইআইইউসি, আপনার কোডে এটি হবে logging.basicConfig(filename="somelog.txt", level=logging.DEBUG)
TryPyPy

128

সংস্করণ ৩.৩, pytestলাইভ লগিং সমর্থন করে, যার অর্থ পরীক্ষার মধ্যে নির্ধারিত সমস্ত লগ রেকর্ডগুলি অবিলম্বে টার্মিনালে মুদ্রিত হবে। বৈশিষ্ট্যটি লাইভ লগস বিভাগের অধীনে নথিভুক্ত করা হয়েছে । লাইভ লগিং ডিফল্টরূপে অক্ষম করা হয়; এটি সক্রিয় করতে, সেট log_cli = 1মধ্যে pyproject.toml1 বা pytest.ini2 কনফিগ। লাইভ লগিং টার্মিনাল এবং ফাইলে নির্গতকে সমর্থন করে; সম্পর্কিত বিকল্প রেকর্ড কাস্টমাইজ করার অনুমতি দেয়:

টার্মিনাল:

  • log_cli_level
  • log_cli_format
  • log_cli_date_format

ফাইল:

  • log_file
  • log_file_level
  • log_file_format
  • log_file_date_format

দ্রষ্টব্য : log_cliপতাকাটি কমান্ড লাইন থেকে প্রেরণ করা যাবে না এবং অবশ্যই সেট আপ করতে হবে pytest.ini। অন্যান্য সমস্ত বিকল্প উভয়ই কমান্ড লাইন থেকে পাস বা কনফিগার ফাইলে সেট করা যেতে পারে। হিসাবে দ্বারা নির্দিষ্ট কেভিন Barre মধ্যে এই মন্তব্যটি , কম্যান্ড লাইন থেকে স্টার অপশন অগ্রাহ্য মাধ্যমে করা যাবে -o/--overrideবিকল্প। প্রকাশক সুতরাং পরিবর্তে log_cliমধ্যে pytest.ini, আপনি কেবল কল করতে পারেন:

$ pytest -o log_cli=true ...

উদাহরণ

প্রদর্শনের জন্য ব্যবহৃত সাধারণ পরীক্ষা ফাইল:

# test_spam.py

import logging

LOGGER = logging.getLogger(__name__)


def test_eggs():
    LOGGER.info('eggs info')
    LOGGER.warning('eggs warning')
    LOGGER.error('eggs error')
    LOGGER.critical('eggs critical')
    assert True

আপনি দেখতে পাচ্ছেন যে অতিরিক্ত কোনও কনফিগারেশন প্রয়োজন নেই; কমান্ড লাইন থেকে pytestনির্দিষ্ট pytest.iniবা পাস করা বিকল্পগুলির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে লগার সেটআপ করবে ।

টার্মিনাল, INFOস্তর, অভিনব আউটপুটে লাইভ লগিং

এতে কনফিগারেশন pyproject.toml:

[tool.pytest.ini_options]
log_cli = true
log_cli_level = "INFO"
log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)"
log_cli_date_format = "%Y-%m-%d %H:%M:%S"

উত্তরাধিকারসূত্রে অভিন্ন কনফিগারেশন pytest.ini:

[pytest]
log_cli = 1
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format=%Y-%m-%d %H:%M:%S

পরীক্ষা চলছে:

$ pytest test_spam.py
=============================== test session starts ================================
platform darwin -- Python 3.6.4, pytest-3.7.0, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-4673373, inifile: pytest.ini
collected 1 item

test_spam.py::test_eggs
---------------------------------- live log call -----------------------------------
2018-08-01 14:33:20 [    INFO] eggs info (test_spam.py:7)
2018-08-01 14:33:20 [ WARNING] eggs warning (test_spam.py:8)
2018-08-01 14:33:20 [   ERROR] eggs error (test_spam.py:9)
2018-08-01 14:33:20 [CRITICAL] eggs critical (test_spam.py:10)
PASSED                                                                        [100%]

============================= 1 passed in 0.01 seconds =============================

টার্মিনাল এবং ফাইলে লাইভ লগিং, কেবলমাত্র বার্তা এবং CRITICALটার্মিনালের স্তর, pytest.logফাইলে অভিনব আউটপুট

এতে কনফিগারেশন pyproject.toml:

[tool.pytest.ini_options]
log_cli = true
log_cli_level = "CRITICAL"
log_cli_format = "%(message)s"

log_file = "pytest.log"
log_file_level = "DEBUG"
log_file_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)"
log_file_date_format = "%Y-%m-%d %H:%M:%S"

উত্তরাধিকারসূত্রে অভিন্ন কনফিগারেশন pytest.ini:

[pytest]
log_cli = 1
log_cli_level = CRITICAL
log_cli_format = %(message)s

log_file = pytest.log
log_file_level = DEBUG
log_file_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_file_date_format=%Y-%m-%d %H:%M:%S

পরীক্ষা রান:

$ pytest test_spam.py
=============================== test session starts ================================
platform darwin -- Python 3.6.4, pytest-3.7.0, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-4673373, inifile: pytest.ini
collected 1 item

test_spam.py::test_eggs
---------------------------------- live log call -----------------------------------
eggs critical
PASSED                                                                        [100%]

============================= 1 passed in 0.01 seconds =============================

$ cat pytest.log
2018-08-01 14:38:09 [    INFO] eggs info (test_spam.py:7)
2018-08-01 14:38:09 [ WARNING] eggs warning (test_spam.py:8)
2018-08-01 14:38:09 [   ERROR] eggs error (test_spam.py:9)
2018-08-01 14:38:09 [CRITICAL] eggs critical (test_spam.py:10)

pyproject.tomlসংস্করণ 6.0 থেকে 1 সমর্থিত এবং সেরা বিকল্প আইএমও। চশমার জন্য পিইপি 518 দেখুন ।

2 আপনি সেটাও কন্ফিগার করতে পারেন যদিও pytestমধ্যে setup.cfgঅধীনে [tool:pytest]অধ্যায়, যা করতে প্রলুব্ধ না হতে যে আপনি যখন কাস্টম লাইভ লগিং বিন্যাস প্রদান করতে চান। অন্যান্য সরঞ্জামগুলি পঠন স্ট্রিং প্রবৃদ্ধির setup.cfgমতো স্টাফকে চিকিত্সা করতে পারে %(message)sএবং ব্যর্থ হতে পারে। সর্বোত্তম পছন্দটি pyproject.tomlযেভাবেই ব্যবহার করা হচ্ছে তবে আপনি যদি উত্তরাধিকারের ইন-স্টাইল বিন্যাসটি ব্যবহার করতে বাধ্য হন তবে pytest.iniত্রুটিগুলি এড়াতে আটকে থাকুন ।


21
দয়া করে মনে রাখবেন আমাদের সম্পর্কে log_cliহতে হবে pytest.ini , এটা আপনি ব্যবহার করতে পারেন বলে মনে হয় -oকম্যান্ড লাইন থেকে ওভাররাইড মান বিকল্প। pytest -o log_cli=true --log-cli-level=DEBUGআমার জন্য কাজ কর.
কেভিন বারে

@ কেভিনভিনার - খুব সুন্দর মন্তব্য এবং সাধারণভাবে একটি খুব দরকারী ইঙ্গিত, ধন্যবাদ! উত্তর আপডেট করেছেন।
hoefling

লগিং ব্যবহার করার সময় এটি অবশ্যই সঠিক উত্তর। যদিও আমি পরীক্ষাগুলির অভ্যন্তরে থাকা লগগুলি এবং পরীক্ষার আওতায় থাকা সিস্টেমের অভ্যন্তরে থাকা লগগুলি পৃথকভাবে বিবেচনা করা উচিত differen
সিএমসিডিগ্রাগনকাই

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

4
@OfekAgmon আপনি যদি pytestআউটপুট সংরক্ষণ করতে চান তবে আপনি --result-logআর্গুমেন্টটি ব্যবহার করতে পারেন (যদিও নোট করুন এটি অবনতিযুক্ত , এখানে বিকল্পগুলি রয়েছে )। আপনি pytestএকই ফাইলটিতে আউটপুট এবং লাইভ লগিং আউটপুট সংরক্ষণ করতে পারবেন না ।
hoefling
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.