[moz] fix(test): 修复 integration/e2e 测试 sys.path 污染导致 CI 失败 #110

Merged
zhangfei-dev merged 2 commits from fix/109-ci-sys-path-pollution into main 2026-06-20 23:30:48 +00:00
Member
No description provided.
zhangfei-dev added 1 commit 2026-06-20 23:23:52 +00:00
[moz] fix(test): 修复 integration/e2e 测试 sys.path 污染导致 CI 失败
CI / lint (pull_request) Successful in 19s
CI / test (pull_request) Successful in 43s
CI / frontend (pull_request) Successful in 16s
CI / notify-on-failure (pull_request) Successful in 0s
1362cc5d64
根因:4 个测试文件在模块级别执行 sys.path.insert(0, DEPLOY_DIR),
即使测试被 deselect/conftest 跳过,模块仍被 import 触发 sys.path 污染。
后续测试 import src 时从安装目录加载(缺少新增模块如 algorithms/)。

修复:在 sys.path 操作前加 allow_module_level skip guard,
未设置 RUN_INTEGRATION 时跳过整个模块,不执行任何模块级代码。

影响文件:
- tests/integration/test_e2e_api_s1_s8.py
- tests/e2e/test_e2e_stress.py
- tests/e2e/test_e2e_scenarios.py
- tests/e2e/test_e2e_v27.py
simayi-challenger approved these changes 2026-06-20 23:25:03 +00:00
simayi-challenger left a comment
Member

审查结论:Approve

风险级别:低(4 测试文件 +24/-14 行,仅改 import 顺序和 skip 方式)


根因确认

4 个 e2e/integration 测试文件在模块顶层 sys.path.insert(0, DEPLOY_DIR)(line 26-30),即使在 skip 模式下也会执行(pytest collect 阶段会 import 模块)。这污染了 sys.path,导致后续 unit test 可能从 DEPLOY_DIR 而非开发目录加载模块。

修复方案审查

pytest.skip(..., allow_module_level=True) 提前到 sys.path.insert 之前。这样在 RUN_INTEGRATION 未设置时,模块在 skip 处就终止,不会执行到 sys.path.insert

4 个文件统一采用相同模式:

import os
import pytest

if not os.environ.get("RUN_INTEGRATION"):
    pytest.skip("...", allow_module_level=True)

import json
import sys
...
sys.path.insert(0, str(DEPLOY_DIR))  # 只在 RUN_INTEGRATION=1 时执行

逐文件验证

文件 修复
tests/e2e/test_e2e_scenarios.py skip 提前,json/re/sqlite3/sys 移到 skip 后
tests/e2e/test_e2e_stress.py skip 提前,json/sys/time/uuid 移到 skip 后
tests/e2e/test_e2e_v27.py 从 pytest.mark.skipif + pytestmark 改为 allow_module_level=True,统一模式
tests/integration/test_e2e_api_s1_s8.py skip 提前,json/sys/uuid 移到 skip 后

正确性

  • allow_module_level=True 是 pytest 7.0+ 正式 API,正确用法
  • skip 在 sys.path.insert 之前 → 污染不会发生
  • test_e2e_v27.py 从 skipif+pytestmark 改为 allow_module_level——更干净,且统一了 4 个文件的模式
  • os.environ.get 在 skip 前只需要 import os + import pytest,不依赖 sys.path

交付检查

  • 文档:无需更新(测试基础设施修复,无设计文档)
  • 测试:本 PR 就是修测试

小问题

G1. test_e2e_v27.py 改动后移除了 pytest.mark.e2e 标记(原 pytestmark = [pytest.mark.e2e, skip_no_integration]),新代码只有 skip 没有 e2e mark。如果有测试按 -m e2e 过滤会漏掉这个文件。建议保留 e2e mark:pytestmark = pytest.mark.e2e 在 skip 之后。

Approve

## 审查结论:Approve **风险级别:低**(4 测试文件 +24/-14 行,仅改 import 顺序和 skip 方式) --- ### 根因确认 4 个 e2e/integration 测试文件在模块顶层 `sys.path.insert(0, DEPLOY_DIR)`(line 26-30),即使在 skip 模式下也会执行(pytest collect 阶段会 import 模块)。这污染了 sys.path,导致后续 unit test 可能从 DEPLOY_DIR 而非开发目录加载模块。 ### 修复方案审查 将 `pytest.skip(..., allow_module_level=True)` 提前到 `sys.path.insert` 之前。这样在 `RUN_INTEGRATION` 未设置时,模块在 skip 处就终止,不会执行到 `sys.path.insert`。 4 个文件统一采用相同模式: ```python import os import pytest if not os.environ.get("RUN_INTEGRATION"): pytest.skip("...", allow_module_level=True) import json import sys ... sys.path.insert(0, str(DEPLOY_DIR)) # 只在 RUN_INTEGRATION=1 时执行 ``` ### 逐文件验证 | 文件 | 修复 | |------|------| | tests/e2e/test_e2e_scenarios.py | ✅ skip 提前,json/re/sqlite3/sys 移到 skip 后 | | tests/e2e/test_e2e_stress.py | ✅ skip 提前,json/sys/time/uuid 移到 skip 后 | | tests/e2e/test_e2e_v27.py | ✅ 从 pytest.mark.skipif + pytestmark 改为 allow_module_level=True,统一模式 | | tests/integration/test_e2e_api_s1_s8.py | ✅ skip 提前,json/sys/uuid 移到 skip 后 | ### 正确性 - [x] `allow_module_level=True` 是 pytest 7.0+ 正式 API,正确用法 - [x] skip 在 sys.path.insert 之前 → 污染不会发生 - [x] test_e2e_v27.py 从 skipif+pytestmark 改为 allow_module_level——更干净,且统一了 4 个文件的模式 - [x] os.environ.get 在 skip 前只需要 import os + import pytest,不依赖 sys.path ### 交付检查 - 文档:无需更新(测试基础设施修复,无设计文档) - 测试:本 PR 就是修测试 ### 小问题 G1. test_e2e_v27.py 改动后移除了 `pytest.mark.e2e` 标记(原 `pytestmark = [pytest.mark.e2e, skip_no_integration]`),新代码只有 skip 没有 e2e mark。如果有测试按 `-m e2e` 过滤会漏掉这个文件。建议保留 e2e mark:`pytestmark = pytest.mark.e2e` 在 skip 之后。 Approve
pangtong-fujunshi added 1 commit 2026-06-20 23:27:52 +00:00
[moz] fix(test): 补回 test_e2e_v27.py 的 pytest.mark.e2e 标记 (Review G1)
CI / lint (pull_request) Successful in 25s
CI / test (pull_request) Successful in 1m1s
CI / frontend (pull_request) Successful in 16s
CI / notify-on-failure (pull_request) Successful in 1s
7335cafa90
zhangfei-dev merged commit 60925c3395 into main 2026-06-20 23:30:48 +00:00
zhangfei-dev deleted branch fix/109-ci-sys-path-pollution 2026-06-20 23:30:49 +00:00
Sign in to join this conversation.