OpenHands 源码解析 · 第 16 讲
OpenHands 源码解析系列 第 16 讲:测试架构与 CI/CD 基于 OpenHands 源码 · 2026-08-12 一、测试体系全景 OpenHands 的测试体系覆盖了后端 Python、前端 React/TypeScript、企业版模块、Docker 镜像构建以及发布流水线。整个仓库包含: 🔹 114 个 Python 后端单元测试 (tests/unit/) 🔹 178 个 企业版测试 (enterprise/tests/) 🔹 299 个 前端测试文件 (frontend/) 🔹 26 个 GitHub Actions 工作流 测试金字塔 OpenHands 遵循经典的三层测试策略:前端 Playwright E2E → 后端 pytest 单元 → 代码质量 Lint/类型检查,每层独立并行执行。 二、pytest 测试框架配置 OpenHands 的测试依赖通过 Poetry 的 test 依赖组管理。让我们看 pyproject.toml 中的配置: 📄 pyproject.toml (第 124-135 行) test = [ "gevent==25.9.1", "pandas", "pytest==9.0.3", "pytest-asyncio==1.3.0", "pytest-cov==7.1.0", "pytest-forked==1.6.0", "pytest-playwright==0.7.2", "pytest-timeout==2.4.0", "pytest-xdist==3.8.0", "reportlab==4.4.10", ] 关键插件解读: 插件 作用 为什么需要 pytest-asyncio 异步测试支持 OpenHands 大量使用 FastAPI + async/await pytest-cov 覆盖率收集 PR 覆盖率评论 + 质量门禁 pytest-forked 隔离测试进程 避免全局状态污染(如 Docker、环境变量) pytest-xdist 并行执行 -n auto 利用多核加速 pytest-playwright 浏览器自动化 E2E 测试前端 UI pytest-timeout 超时保护 防止 CI 阻塞 三、CI 流水线架构 每个 PR 和 main 分支推送都会触发以下流水线: 1. Python 测试流水线 (py-tests.yml) 📄 .github/workflows/py-tests.yml (第 59-60 行) - name: Run Unit Tests run: PYTHONPATH=".:$PYTHONPATH" poetry run pytest \ --forked -n auto -s ./tests/unit \ --cov=openhands --cov-branch 执行策略: 🔹 --forked :每个测试在独立进程中运行,避免 Docker/K8s 测试污染全局状态 🔹 -n auto :自动使用所有 CPU 核心并行执行 🔹 --cov-branch :分支级别覆盖率(不仅是行覆盖率) 🔹 覆盖率文件通过 actions/upload-artifact 上传,后续合并 2. 企业版测试 (py-tests.yml test-enterprise) 📄 .github/workflows/py-tests.yml (第 90-92 行) - name: Run Unit Tests run: PYTHONPATH=".:$PYTHONPATH" poetry run --project=enterprise \ pytest --forked -n auto -s -p no:ddtrace \ -p no:ddtrace.pytest_bdd -p no:ddtrace.pytest_benchmark \ ./enterprise/tests/unit --cov=enterprise --cov-branch 注意: 企业版测试显式禁用了 ddtrace 插件(Datadog APM),避免 CI 环境中遥测干扰。 3. 覆盖率评论 (coverage-comment job) 📄 .github/workflo…