Skip to content

TestReport.when/location have the wrong type reported by type checkers #12941

Closed

Description

@asqui

Type checkers report the type of TestReport.when as Union[builtins.str, None] (coming from the BaseReport base class) rather than the correct type for TestReport of Literal["setup", "call", "teardown"].

(I checked this with mypy 1.10.0 and pyright 1.1.342)

This looks to be due to the fact that the BaseReport annotation is on a class attribute, which takes precedence over the instance attribute assigned within the derived TestReport class.

Repro

def pytest_runtest_logreport(report: TestReport) -> None:
    reveal_type(report.when)

mypy 1.10.0 reports:

note: Revealed type is "Union[builtins.str, None]"

(The actual type is Literal["setup", "call", "teardown"])

Suggested Solution

I think this can be resolved by adding a class-level type annotation to TestReport with the narrower type (the same applies to location):

@final
class TestReport(BaseReport):
    # [...]
    when: Literal["setup", "call", "teardown"]
    location: tuple[str, int | None, str]
    # [...]

Activity

  1. added 3 commits that reference this issue on Apr 3, 2025
    e2b53c6
    8fa571d
    8f691c1
  2. added a commit that references this issue on Apr 3, 2025
    4056433
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions