-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
No stdout/stderr is captured with invoke
during tests in combination with structlog
#2827
Comments
I had lots of issues with Click <= 8.1.x when writing unittests for my logging helpers in Click Extra (see: https://kdeldycke.github.io/click-extra/logging.html ). Tl;Dr: I had to extensively patch the |
@kdeldycke thank you, appreciate your help! I just tried it from the release but the same test case I originally posted still fails :/ ➜ click-structlog uv add git+https://github.com/pallets/[email protected]
Resolved 15 packages in 93ms
Updated https://github.com/pallets/click.git (e4c24ca)
Built click @ git+https://github.com/pallets/click.git@e4c24ca309ebe77ab029dac9b6d27d49fff5964f
Prepared 1 package in 2.27s
Uninstalled 1 package in 11ms
Installed 1 package in 2ms
- click==8.1.7
+ click==8.2.0 (from git+https://github.com/pallets/click.git@e4c24ca309ebe77ab029dac9b6d27d49fff5964f)
➜ click-structlog uv run pytest
==================================================================== test session starts =====================================================================
platform darwin -- Python 3.12.7, pytest-8.3.4, pluggy-1.5.0
rootdir: click-structlog
configfile: pyproject.toml
collected 1 item
test_app.py F [100%]
========================================================================== FAILURES ==========================================================================
__________________________________________________________________________ test_log __________________________________________________________________________
def test_log() -> None:
runner = CliRunner()
result = runner.invoke(hello)
print(result.stdout)
> assert "Hello" in result.stdout
E AssertionError: assert 'Hello' in ''
E + where '' = <Result okay>.stdout
test_app.py:8: AssertionError
-------------------------------------------------------------------- Captured stdout call --------------------------------------------------------------------
================================================================== short test summary info ===================================================================
FAILED test_app.py::test_log - AssertionError: assert 'Hello' in ''
===================================================================== 1 failed in 0.17s ====================================================================== |
There seems to be an issue with capturing stdout/stderr when using
structlog
with stdlibLogger
in tests.I've raised an issue with
structlog
but they are not convinced the problem originates there since the logs are simply passed to the stdlib Logger.I've traced this down to the click's
isolation
context manager which seems to replacesys.stdout
/sys.stderr
with mocks during testing and my guess would be that this could have something to do with the problem but I'm hoping you may know better.I've tried numerous things like explicitly setting a
StreamHandler(sys.stderr)
to the stdlibbasicConfig
, experimented withmix_stderr
etc. nothing helped. Any ideas how to fix or work around this issue would be most welcome, thank you.An example
A test case:
Expected
Hello! (to be printed)
assertion to pass
Actual
nothing printed (result.stdout is empty)
assertion failure:
The text was updated successfully, but these errors were encountered: