Bird
Raised Fist0
PyTesttesting~5 mins

capfd for file descriptors in PyTest - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does the pytest fixture capfd capture?
The capfd fixture captures output sent to the system file descriptors stdout and stderr. This means it captures output from print statements and error messages during test execution.
Click to reveal answer
beginner
How do you retrieve the captured output using capfd in a pytest test?
You call out, err = capfd.readouterr() inside your test. out contains the captured standard output, and err contains the captured standard error.
Click to reveal answer
intermediate
Why is capfd useful compared to capturing output with capsys?
capfd captures output at the file descriptor level, so it can capture output from C extensions or subprocesses, while capsys captures output at the Python sys module level only.
Click to reveal answer
intermediate
What happens if you call capfd.readouterr() multiple times in the same test?
Each call to <code>readouterr()</code> returns the output captured since the last call and clears the buffer. So multiple calls let you check output in stages.
Click to reveal answer
intermediate
Can capfd capture output from subprocesses spawned during a test?
Yes, because capfd captures output at the file descriptor level, it can capture output from subprocesses, unlike capsys.
Click to reveal answer
What does capfd capture in pytest?
AOnly logging messages
BOnly Python print statements
COutput sent to system file descriptors stdout and stderr
DOnly exceptions
How do you get the captured output from capfd?
AUsing <code>capfd.readouterr()</code>
BUsing <code>capfd.get_output()</code>
CUsing <code>capfd.capture()</code>
DUsing <code>capfd.output()</code>
Which is true about capfd compared to capsys?
A<code>capsys</code> captures output at the file descriptor level
B<code>capfd</code> only captures Python sys.stdout
C<code>capsys</code> captures subprocess output
D<code>capfd</code> captures output at the file descriptor level
What happens when you call capfd.readouterr() multiple times?
AIt returns output since last call and clears buffer
BIt returns the same output every time
CIt raises an error
DIt disables output capture
Can capfd capture output from subprocesses?
ANo, it only captures Python output
BYes, because it captures at file descriptor level
COnly if subprocess uses Python print
DOnly if subprocess is run with special flags
Explain how the pytest fixture capfd works and when you would use it.
Think about capturing output beyond just Python print statements.
You got /4 concepts.
    Describe the difference between capfd and capsys in pytest.
    Consider the level at which output is captured.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of capfd in pytest?
      easy
      A. To capture output printed to the console during tests
      B. To mock database connections in tests
      C. To measure test execution time
      D. To generate test reports automatically

      Solution

      1. Step 1: Understand capfd functionality

        capfd is a pytest fixture used to capture output sent to standard output (stdout) and standard error (stderr) during test execution.
      2. Step 2: Identify correct purpose

        Since capfd captures printed output, it helps verify what the code prints without changing the code itself.
      3. Final Answer:

        To capture output printed to the console during tests -> Option A
      4. Quick Check:

        capfd captures printed output = B [OK]
      Hint: Remember capfd captures print output and errors [OK]
      Common Mistakes:
      • Confusing capfd with mocking tools
      • Thinking capfd measures time
      • Assuming capfd generates reports
      2. Which of the following is the correct way to use capfd in a pytest test function?
      easy
      A. def test_func(capsys): output = capfd.readouterr()
      B. def test_func(capfd): output = capfd.readouterr()
      C. def test_func(): output = capfd.readouterr()
      D. def test_func(capfd): output = capfd.capture()

      Solution

      1. Step 1: Check pytest fixture usage

        To use capfd, it must be a parameter in the test function so pytest injects it.
      2. Step 2: Verify method call

        The correct method to get captured output is readouterr(), not capture().
      3. Final Answer:

        def test_func(capfd): output = capfd.readouterr() -> Option B
      4. Quick Check:

        Use capfd parameter and readouterr() method = D [OK]
      Hint: Use capfd as function argument and call readouterr() [OK]
      Common Mistakes:
      • Using capsys instead of capfd
      • Calling non-existent capture() method
      • Not passing capfd as parameter
      3. Given the following test code, what will be the value of captured.out after capfd.readouterr() is called?
      def greet():
          print('Hello, world!')
      
      def test_greet(capfd):
          greet()
          captured = capfd.readouterr()
      medium
      A. "Hello, world!\n"
      B. "Hello, world!"
      C. "" (empty string)
      D. An exception is raised

      Solution

      1. Step 1: Understand what greet() prints

        The function greet() prints the string "Hello, world!" followed by a newline.
      2. Step 2: Check captured output from capfd

        capfd.readouterr() captures stdout including newlines, so captured.out will be "Hello, world!\n".
      3. Final Answer:

        "Hello, world!\n" -> Option A
      4. Quick Check:

        Printed string plus newline = C [OK]
      Hint: Print adds newline, capfd captures it too [OK]
      Common Mistakes:
      • Forgetting the newline character
      • Expecting empty string if not returned
      • Thinking an exception occurs
      4. What is wrong with this test code using capfd?
      def test_error(capfd):
          print('Start')
          raise ValueError('Oops')
          captured = capfd.readouterr()
          assert captured.out == 'Start\n'
      medium
      A. The assertion should check captured.err instead of captured.out
      B. The print statement does not produce output
      C. The capfd.readouterr() call is after the exception, so it never runs
      D. capfd cannot capture output if exceptions occur

      Solution

      1. Step 1: Analyze code flow with exception

        The raise ValueError stops execution immediately, so capfd.readouterr() and the assertion never run.
      2. Step 2: Identify the problem

        Because the capture call is after the exception, the test does not capture output or perform the assertion.
      3. Final Answer:

        The capfd.readouterr() call is after the exception, so it never runs -> Option C
      4. Quick Check:

        Exception stops code before capture call = A [OK]
      Hint: Place capture before exceptions to avoid skipping [OK]
      Common Mistakes:
      • Assuming print output is lost
      • Thinking capfd fails on exceptions
      • Checking wrong captured attribute
      5. You want to test a function that prints to both standard output and standard error. How do you correctly assert both outputs using capfd?
      def test_both_outputs(capfd):
          print('Output')
          import sys
          print('Error', file=sys.stderr)
          captured = capfd.readouterr()
          # What assertions should you write?
      hard
      A. assert captured.out == '' and captured.err == 'Output\nError\n'
      B. assert captured.out == 'Output' and captured.err == 'Error'
      C. assert captured.out == 'Output\nError\n' and captured.err == ''
      D. assert captured.out == 'Output\n' and captured.err == 'Error\n'

      Solution

      1. Step 1: Understand output streams

        print('Output') writes to standard output with a newline, and print('Error', file=sys.stderr) writes to standard error with a newline.
      2. Step 2: Check captured attributes

        captured.out holds stdout, so it should be "Output\n"; captured.err holds stderr, so it should be "Error\n".
      3. Final Answer:

        assert captured.out == 'Output\n' and captured.err == 'Error\n' -> Option D
      4. Quick Check:

        Separate stdout and stderr captured correctly = A [OK]
      Hint: Assert captured.out and captured.err separately with newlines [OK]
      Common Mistakes:
      • Mixing stdout and stderr in one assertion
      • Forgetting newline characters
      • Checking wrong captured attribute
      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