Skip to content

テスト: 共通層のモジュールを sys.modules に登録せずに読む 2 つのテストが、dataclass と from __future__ import annotations の組み合わせで落ちる #789

Description

@takemi-ohama

何を見つけたか

共通層のモジュールを読むテストのうち 2 つ(plugins/ndf/skills/cross-review/tests/test_monitor_outcome_file.py_load_outcome_modplugins/ndf/scripts/tests/test_monitor_outcome_unit.py_load_monitor_outcome)は、importlib.util.spec_from_file_location で読み込んだモジュールを sys.modules に登録しない。この形で読んだモジュールが from __future__ import annotations の下で @dataclass を持つと、dataclass が型注釈を解くときに sys.modules[cls.__module__] を引いて KeyError で落ちる。

再現: plugins/ndf/scripts/lib/monitor_outcome.py の先頭に from __future__ import annotations を戻し、@dataclass(frozen=True) class LaunchOutcome を持ったまま上の 2 テストを実行する。

どこで見つけたか

#729 の実装(結末を 1 つの値として読む関数 read_launch_outcomeLaunchOutcome の新設)で、monitor_outcome.pydataclass を足したとき。回避として monitor_outcome.py から from __future__ import annotations を外した(Python 3.10 以上では注釈を実行時に評価できるため振る舞いは同じ)。

cross-review の tests/conftest.py_load_modulesys.modules[name] = mod を行っており、この落とし穴に当たらない。

なぜこの変更の範囲外なのか

#729 の受け入れ条件(AC1〜AC24)はテストの読み込みの流儀を対象にしていない。実装計画の「やらないこと」にも無いが、直す対象は共通層と cross-review の結果なしの判断であって、テストの足場ではない。

直さないと何が起きるか

共通層(plugins/ndf/scripts/lib/)に dataclass を持つモジュールを足す・既存のモジュールに from __future__ import annotations を足すたびに、読み込みの流儀の違いで一部のテストだけが落ちる。落ちる理由が読み込みの側にあるため、実装の誤りと切り分けるのに時間がかかる。

直し方の候補: 2 つのテストの読み込みを conftest._load_module と同じ形(sys.modules へ登録する)へ揃える。

由来

issue #729(G3 の実装。Pull Request は作成前)

Activity

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