Bird
Raised Fist0
PyTesttesting~5 mins

caplog for log messages in PyTest - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of caplog in pytest?

caplog is used to capture log messages during test execution. It helps verify that the expected logs are generated by the code under test.

Click to reveal answer
beginner
How do you access captured log messages using caplog?

You can access captured logs via caplog.records for log records or caplog.text for the full log output as a string.

Click to reveal answer
intermediate
How can you set the log level when using caplog in a test?

Use caplog.set_level("LEVEL") to set the minimum log level to capture, for example caplog.set_level("INFO").

Click to reveal answer
beginner
Write a simple pytest test snippet using caplog to check if a warning log message was emitted.
def test_warning_log(caplog):
    import logging
    logger = logging.getLogger()
    with caplog.at_level(logging.WARNING):
        logger.warning("This is a warning")
    assert "This is a warning" in caplog.text
Click to reveal answer
beginner
Why is capturing logs useful in automated tests?

Capturing logs helps confirm that the code behaves as expected internally, especially for warnings, errors, or important info messages, improving test coverage and debugging.

Click to reveal answer
What does caplog.records provide in pytest?
AThe current log level setting
BThe full log output as a single string
CA list of log record objects captured during the test
DThe number of log messages emitted
How do you change the log level to capture only warnings and above with caplog?
Acaplog.set_level("INFO")
Bcaplog.set_level("WARNING")
Ccaplog.set_level("DEBUG")
Dcaplog.set_level("ERROR")
Which pytest fixture is used to capture log messages?
Acaplog
Blogcapture
Clogfixture
Dcapturelog
What is the best way to check if a specific log message was emitted in a test?
AAssert the message is in <code>caplog.text</code>
BPrint logs and check manually
CUse <code>print()</code> statements
DCheck the console output after test
What does caplog.at_level(logging.WARNING) do?
AFilters out WARNING messages
BDisables log capturing
CSets the global log level to WARNING permanently
DTemporarily sets the log capture level to WARNING within the block
Explain how to use caplog in pytest to verify that a specific log message was generated.
Think about capturing logs and checking their content.
You got /5 concepts.
    Describe why capturing logs with caplog is helpful in automated testing.
    Logs tell us what happened inside the code.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using caplog in pytest tests?
      easy
      A. To capture and check log messages generated during test execution
      B. To mock external API calls in tests
      C. To measure test execution time
      D. To generate test reports automatically

      Solution

      1. Step 1: Understand caplog's role in pytest

        caplog is a pytest fixture used to capture log messages during tests.
      2. Step 2: Identify the main use

        It allows assertions on log output to verify correct logging behavior.
      3. Final Answer:

        To capture and check log messages generated during test execution -> Option A
      4. Quick Check:

        caplog = capture logs [OK]
      Hint: caplog captures logs so you can check messages easily [OK]
      Common Mistakes:
      • Confusing caplog with mocking tools
      • Thinking caplog measures time
      • Assuming caplog generates reports
      2. Which of the following is the correct way to use caplog to capture only WARNING level logs in a test function?
      easy
      A. caplog.log_level(logging.WARNING)
      B. caplog.set_level(logging.WARNING)
      C. caplog.capture_level = logging.WARNING
      D. with caplog.at_level(logging.WARNING):

      Solution

      1. Step 1: Recall caplog syntax for setting log level

        caplog uses a context manager method at_level() to set the log level temporarily.
      2. Step 2: Match correct syntax

        The correct syntax is with caplog.at_level(logging.WARNING): to capture warnings.
      3. Final Answer:

        with caplog.at_level(logging.WARNING): -> Option D
      4. Quick Check:

        Use caplog.at_level() for log level [OK]
      Hint: Use with caplog.at_level(level) to set capture level [OK]
      Common Mistakes:
      • Trying to set level by assignment
      • Using non-existent caplog methods
      • Forgetting to use 'with' for context
      3. Given the following test code, what will be the output of the assertion?
      import logging
      
      def test_log_message(caplog):
          with caplog.at_level(logging.INFO):
              logging.info('Test started')
          assert 'Test started' in caplog.text
      medium
      A. The assertion passes because the log message is captured
      B. The assertion fails because caplog.text is empty
      C. The test raises a NameError due to missing import
      D. The assertion fails because logging level is too low

      Solution

      1. Step 1: Analyze log capture level

        The code sets caplog to capture INFO level logs, which includes the info message logged.
      2. Step 2: Check assertion on caplog.text

        The message 'Test started' is logged and appears in caplog.text, so the assertion passes.
      3. Final Answer:

        The assertion passes because the log message is captured -> Option A
      4. Quick Check:

        Logged message in caplog.text = assertion pass [OK]
      Hint: caplog.text holds captured logs as a string [OK]
      Common Mistakes:
      • Assuming caplog.text is empty without at_level
      • Confusing log levels and capture
      • Forgetting to import logging
      4. Identify the error in the following pytest test using caplog:
      import logging
      
      def test_error_log(caplog):
          caplog.at_level(logging.ERROR)
          logging.error('An error occurred')
          assert 'An error occurred' in caplog.text
      medium
      A. logging.error() is called before caplog is imported
      B. caplog.at_level() must be used as a context manager with 'with'
      C. assertion should check caplog.records instead of caplog.text
      D. logging level ERROR is too high to capture

      Solution

      1. Step 1: Check usage of caplog.at_level()

        caplog.at_level() is a context manager and must be used with 'with' keyword.
      2. Step 2: Identify missing 'with' statement

        The code calls caplog.at_level() without 'with', so it does not set the level properly.
      3. Final Answer:

        caplog.at_level() must be used as a context manager with 'with' -> Option B
      4. Quick Check:

        Use 'with caplog.at_level()' not just call [OK]
      Hint: Always use 'with' for caplog.at_level() context [OK]
      Common Mistakes:
      • Calling caplog.at_level() without 'with'
      • Checking wrong caplog attribute
      • Misunderstanding log level capture
      5. You want to test that your function logs a WARNING message only when a certain condition is true. Which pytest test code correctly uses caplog to check this behavior?
      hard
      A. def test_warn_log(caplog): with caplog.at_level(logging.WARNING): my_function(True) assert 'Warning triggered' in caplog.text with caplog.at_level(logging.WARNING): my_function(False) assert 'Warning triggered' not in caplog.text
      B. def test_warn_log(caplog): with caplog.at_level(logging.INFO): my_function(True) assert 'Warning triggered' in caplog.text
      C. def test_warn_log(caplog): with caplog.at_level(logging.WARNING): my_function(True) my_function(False) assert caplog.text.count('Warning triggered') == 1
      D. def test_warn_log(caplog): caplog.set_level(logging.WARNING) my_function(True) assert 'Warning triggered' in caplog.text my_function(False) assert 'Warning triggered' not in caplog.text

      Solution

      1. Step 1: Understand the requirement

        We want to check that the warning message logs only once when condition is true, not when false.
      2. Step 2: Analyze options for correct caplog usage

        def test_warn_log(caplog): with caplog.at_level(logging.WARNING): my_function(True) my_function(False) assert caplog.text.count('Warning triggered') == 1 uses one context capturing both calls and asserts the warning appears exactly once, matching the requirement.
      3. Step 3: Why other options fail

        def test_warn_log(caplog): with caplog.at_level(logging.WARNING): my_function(True) assert 'Warning triggered' in caplog.text with caplog.at_level(logging.WARNING): my_function(False) assert 'Warning triggered' not in caplog.text: separate contexts but caplog.text accumulates logs, so second assert 'Warning triggered' not in caplog.text fails (message from first call persists); def test_warn_log(caplog): caplog.set_level(logging.WARNING) my_function(True) assert 'Warning triggered' in caplog.text my_function(False) assert 'Warning triggered' not in caplog.text: caplog.set_level does not exist (AttributeError), and accumulation would fail second assert; def test_warn_log(caplog): with caplog.at_level(logging.INFO): my_function(True) assert 'Warning triggered' in caplog.text: tests only True case with INFO level (captures WARNING but no False verification).
      4. Final Answer:

        def test_warn_log(caplog): with caplog.at_level(logging.WARNING): my_function(True) my_function(False) assert caplog.text.count('Warning triggered') == 1 -> Option C
      5. Quick Check:

        Use one caplog context and count messages [OK]
      Hint: Use one with caplog.at_level() block and count messages [OK]
      Common Mistakes:
      • Using multiple caplog contexts losing logs
      • Using wrong log level in at_level
      • Assuming caplog.set_level exists
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard