Skip to content

Click v8.2+ Compatibility - Breaking Changes with mix_stderr Parameter #1006

@ninjinkun

Description

@ninjinkun

Issue: Click v8.2+ Compatibility - Breaking Changes with mix_stderr Parameter

Summary

The CLI test suite fails with Python 3.10 + Click 8.2+ due to breaking changes in Click's CliRunner class, specifically the removal of the mix_stderr parameter. This parameter was used extensively in our test suite to control how stdout and stderr are handled in test outputs.

Background

In our test suite, we use CliRunner(mix_stderr=False) to separate stdout and stderr outputs in test results. Many tests rely on this behavior when verifying output patterns and error messages. With Click 8.2+, this parameter has been completely removed, causing test failures.

Error Details

When running tests with Python 3.10 (which uses Click 8.2+), we get the following error:

TypeError: CliRunner.__init__() got an unexpected keyword argument 'mix_stderr'
======================================================================
ERROR [0.002s]: test_record_test (tests.test_runners.test_robot.RobotTest.test_record_test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/runner/.local/share/virtualenvs/cli-uK8bV6hy/lib/python3.11/site-packages/responses/__init__.py", line 232, in wrapper

Changes in Click 8.2+

According to the Click GitHub Issues and Pull Request:

  1. Before Click 8.2:

    • CliRunner had a mix_stderr parameter
    • mix_stderr=True (default): stdout and stderr mixed in result.stdout and result.output
    • mix_stderr=False: stdout in result.stdout, stderr in result.stderr
  2. After Click 8.2:

    • The mix_stderr parameter has been completely removed
    • Results always provide separate stdout and stderr access:
      • result.stdout: Contains only stdout
      • result.stderr: Contains only stderr
      • result.output: Combined output (similar to what a user would see in a terminal)

Impact on Our Tests

Several test cases fail because they expect error messages to be in result.stdout when mix_stderr=False is specified, but with Click 8.2+ these messages are now in result.stderr.

Affected test files include:

  • tests/commands/test_subset.py
  • tests/test_runners/test_raw.py
  • And potentially others that rely on the mix_stderr behavior

Dependency Configuration

Our current dependency configuration in setup.cfg specifies:

install_requires =
    click>=8.0,<8.1;python_version=='3.6'
    click>=8.1,<8.2;python_version>'3.6'

This means we're trying to use Click < 8.2, but when running with Python 3.10 in CI environments, Click 8.2+ is being installed, causing these compatibility issues.

Potential Solutions

  1. Modify test cases to check both stdout and stderr for expected messages
  2. Create a compatibility wrapper for CliRunner that emulates the old behavior
  3. Conditionally set parameters based on the Click version
  4. Update dependency constraints to explicitly limit Click version to < 8.2 for all Python versions

Next Steps

We need to decide on the best approach to maintain compatibility with both older Click versions and Click 8.2+, while minimizing code changes and maintaining test clarity.

Related Information

  • Click Repository Issue: #2522
  • Click Pull Request: #2523
  • Python Version: 3.10
  • Click Version: 8.2.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions