Skip to content

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

@asqui

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]
    # [...]

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