ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Beads 项目测试指南:从最小缝测试到 CI 验证的完整实践手册

Beads 项目测试指南:从最小缝测试到 CI 验证的完整实践手册 Beads 项目测试指南从最小缝测试到 CI 验证的完整实践手册【免费下载链接】beadsBeads - A memory upgrade for your coding agent项目地址: https://gitcode.com/GitHub_Trending/beads1/beads导读本文以 Beads 仓库的 engdocs/TESTING.md 为权威依据系统讲解 Beads编码 Agent 记忆层项目的测试命令、测试选择策略与测试设计规范涵盖./scripts/test.sh运行器、Makefile 目标、隔离测试环境、层级准入标准与失败/跳过处理流程。读者读完可掌握 Beads 开发中最小可用测试的选择方法、本地与 CI 的复现路径以及一套可复用的 Go 仓库测试治理框架。从权威文档出发TESTING.md 的定位在 Beads 仓库中TESTING.md是测试命令、测试选择与测试设计的唯一权威来源single authority。它面向本地开发工作流如果需要了解某个 CI 检查背后的确切命令应当去查对应的 workflow 文件与Makefile目标而不是依赖过时的维护者笔记。仓库中的 engdocs/CI_TEST_SURFACE_AUDIT.md 与 engdocs/CI_CLEANUP_PLAN.md 属于历史 CI 清单与维护规划背景资料用于参考而非实时 CI 清单二者并不构成第二份测试指南。这一单一权威 上下文文档分离的结构正是 Beads 测试治理的核心思想命令以代码脚本、Makefile、workflow为准文档负责解释设计与策略。选择最小的有用测试Choose the Smallest Useful TestBeads 的测试层级策略可以概括为一句话在能因用户可见原因而失败的最低缝seam上测试。只有当下层无法覆盖特定风险时才增加更高层级——例如集成接线integration wiring、真实持久化属性、进程边界或外部契约。这并不意味着每个测试都必须是单元测试当缺陷可能存在于真实边界时就应该使用真实边界。文档给出了一张按需选择测试命令的速查表需求命令适用时机仅文档改动验证git diff --check、go test -tagsgms_pure_go ./test/docsync、./scripts/check-doc-freshness.sh纯散文改动按需追加生成文档或特定 surface 的链接检查。不要因为改了一个 Markdown 文件就跑完整 Go 测试套件聚焦红绿循环./scripts/test.sh -run ^TestExactName$ ./path/to/package/...正在编写或修复单个行为时受影响包确认./scripts/test.sh ./path/to/package/...聚焦测试通过后直接受影响的邻居包契约变化时一并覆盖最终 Go 基线make test聚焦工作通过后跑一次应用正常的本地构建标志、覆盖率和本地跳过处理指定 CI 包装make ci-pr-core、make ci-pr-policy或make ci-pr-lint运行受影响风险/surface 对应的包装或用于复现该 CI 检查不要对每次编辑例行跑全部三个关键纪律不要用反复跑完整套件来替代聚焦循环。受影响的 Go 测试变绿后最终只跑一次make test纯文档改动则使用文档、链接与 diff 检查。从 Makefile 可以看到这些包装目标的实现Makefileci-pr-core: ./scripts/ci/pr-core.sh ci-pr-policy: ./scripts/ci/pr-policy.sh ci-pr-lint: ./scripts/ci/pr-lint.sh它们分别对应 scripts/ci/pr-core.sh、scripts/ci/pr-policy.sh、scripts/ci/pr-lint.sh 三个入口把 CI 中真实执行的检查包装为可本地复现的命名目标。命令与本地环境Commands and Local Environment./scripts/test.sh标准测试运行器./scripts/test.sh是 Beads 的正常测试入口。它的工作流程见 scripts/test.sh 源码包括source.buildflags注入项目统一的构建标志——gms_pure_go构建标签让 go-mysql-server 使用 Go 标准库正则而非 ICU 后端与CGO_ENABLED1嵌入式 Dolt 运行时必需见 .buildflags创建隔离测试环境通过 scripts/ci/lib/test-env.sh 中的beads_test_env_enter完成应用.test-skip把 .test-skip 中非注释、非空行拼成|分隔的-skip正则模式默认 25 分钟每包超时TIMEOUT${TEST_TIMEOUT:-25m}作为卡死兜底而非性能目标。关于 25m 超时的设定脚本注释给出了详实的工程依据cmd/bd是最慢的包2026-07-26 在繁忙的 darwin 机器上测量默认套件约 1090 秒、约 1490 个测试多为串行子进程测试3 分钟根本无法容纳曾导致每次全套件运行都因包超时恐慌而失败。25 分钟为该测量值加上负载余量。不要把它调低到低于 cmd/bd 的实测运行时间。环境变量与等价命令行参数文档给出的常见用法与脚本参数解析一一对应TEST_TIMEOUT30m ./scripts/test.sh ./cmd/bd/... TEST_VERBOSE1 ./scripts/test.sh ./cmd/bd/... TEST_RUN^TestExactName$ ./scripts/test.sh ./cmd/bd/... # 等价的命令行选项 ./scripts/test.sh -v -run ^TestExactName$ ./cmd/bd/... ./scripts/test.sh -timeout 30m ./cmd/bd/...脚本还支持-skip追加额外跳过模式、TEST_COVER/TEST_COVERPROFILE/TEST_COVERPKG控制覆盖率输出-covermodeatomic以及GO_TEST_PKG_PARALLEL/GO_TEST_PARALLEL默认均为 4控制包级与测试级并发。值得一提的优化当请求的包模式可能包含cmd/bd时脚本会预构建一次 bd 二进制并导出BEADS_TEST_BD_BINARY用户显式提供的值优先级最高避免测试中每个子进程辅助函数各自go build导致链接超时CI 已从预构建产物导出该变量本地运行器因此获得同样的快速路径。专用目标与 ICU 路径ICU 正则路径可选make test-icu-path等价于./scripts/test-icu-path.sh ./...仅在改动确实需要时才使用属于维护者专用不在常规验证范围内make test-full-cgo与./scripts/test-cgo.sh是已废弃的兼容别名仅转发到make test-icu-path命名专用目标仅在风险范围内时使用make test-regression # 差分回归测试基线 vs 当前工作树 make test-upgrade # 升级冒烟测试发布稳定性门禁 make test-cross-version # 跨版本冒烟测试最近 30 个 tag make test-migration # 认证历史升级语料测试严格保真检查从 Makefile 可以看到这些目标的细节test-regression使用-tagsregression,$(BUILD_TAGS)跑./tests/regression/...基线默认 v0.49.6、可用BD_REGRESSION_BASELINE_BIN覆盖test-upgrade验证从上一版本升级后数据、角色与模式保持test-cross-version用旧版本创建 epic/issue/依赖后升级验证test-migration则基于 scripts/migration-test/ 的认证语料做保真校验。对于失败的 GitHub Actions 检查以当前 workflow 及其 Makefile 目标为准进行精确复现——本地运行器与 CI 在部分场景下刻意采用不同契约。测试环境与就绪性Test Environment and Readiness运行器会隔离HOME、Git 配置与 Dolt 状态。看 scripts/ci/lib/test-env.sh 的实现隔离细节非常彻底创建临时$root目录分别建立home/、xdg-config/、dolt-root/并生成一个空的 gitconfig导出HOME、USERPROFILE、XDG_CONFIG_HOME、DOLT_ROOT_PATH、GIT_CONFIG_NOSYSTEM1、GIT_CONFIG_GLOBAL指向隔离位置并设BEADS_TEST_IGNORE_REPO_CONFIG1主动 unset 一批环境变量BEADS_DIR、BEADS_DB、BD_DB、BD_JSON、BD_NO_DB、BD_ACTOR、GT_ROOT、以及所有BEADS_DOLT_*服务器相关变量防止开发者的数据库/守护进程/全局配置泄漏进测试默认把dolt追加进BEADS_TEST_SKIP仅在刻意演练 Dolt 路径且前置条件齐备时才设置BEADS_TEST_ENV_RUN_DOLT1。普通测试不得依赖开发者的数据库、守护进程、全局 Git 配置或文件系统状态。显式跳过可选服务使用既有跳过机制BEADS_TEST_SKIPdolt ./scripts/test.sh ./...需要临时仓库或存储的测试应使用t.TempDir()与t.Cleanup()临时仓库必须设置仓库级 hooks 路径不得继承开发者的全局 hooks 配置。手工 CLI 实验的正确姿势文档强烈建议从一次性工作目录同时运行初始化与后续命令beads_manual_dir$(mktemp -d) ( set -e cd $beads_manual_dir bd init --quiet --prefix test --skip-hooks --skip-agents bd create Test issue -p 1 ) rm -rf -- $beads_manual_dir⚠️ 注意BEADS_DB只负责选择打开数据库类命令所用的数据库不会把bd init的工作区搭建重定向走。绝不要仅仅因为BEADS_DB指向别处就在生产工作区里手工运行bd init。testing.Short()的使用边界testing.Short()只用于真实的运行时、压力或大型 fixture 跳过不能作为声明集成/端到端/API/Docker/外部依赖边界的替代品。新用法必须符合仓库策略make check-testing-short该检查由 scripts/check-testing-short.sh 实现它维护一份允许清单如internal/hooks/hooks_test.go::TestRunSync_Timeout、internal/storage/dolt/concurrent_test.go::TestHighContentionStress等 8 处扫描所有testing.Short()调用点并定位所在函数凡不在清单内的一律报错——集成/e2e/API 边界应改用构建标签、环境检查或命名包装目标。测试设计Test Design缝、场景与替身Seams, Scenarios, and Doubles一个场景写在一个能证明该行为的最小缝上覆盖改变用户结果的那个边界或失败模式共享 setup 时用表驱动子测试。不要仅仅因为 helper、每个调用方和 CLI 都存在就把同一场景在每一层重复一遍。录制型替身recording double或 fake 应当狭窄只建模测试需要的调用、输入、输出与失败不要为了让单测看起来真实而重新实现存储引擎、进程管理器或其他子系统。行为型 fake 则不同如果它代理的是多个生产实现共享的契约就必须与那些实现共享同一套语义一致性semantic-conformance套件。该共享套件定义了可观察行为防止 fake 教会调用方一套生产代码并不兑现的契约。两种一致性Conformance的区分类型回答的问题语义一致性Semantic conformance对同一操作实现是否产生承诺的结果、错误与状态迁移持久化一致性Persistence conformance真实持久化边界是否保持其所需的持久性durability、事务、迁移与恢复属性二者回答的是不同问题。除非有书面契约及其一致性套件背书不得宣称后端对等backend parity。Beads 仓库的 backend/conformance/ 目录正是这套思想的落地——其中包含reader_contract.go、querier_contract.go、lifecycle_create_contract.go、batch_creator_contract.go等一整套面向后端的契约测试文件与 issueops/ 下各角色实现一一对应验证同一操作在不同后端上产生相同可观察行为。层级准入Tier Admission集成测试只有在覆盖狭窄替身无法证明的独特边界时才应放在单元缝之上例如配置接线、真实文件系统或 Git 交互、子进程协议、持久化行为。端到端测试仅当以下四条全部成立时才被准入失败将是用户可见的真实进程、setup 或接线边界拥有较低缝无法证明的独特失败风险底层行为在可行时已由较低层级覆盖端到端测试聚焦于该边界没有既有端到端测试已覆盖相同的边界风险。注意区分较低层级对同一用户旅程的覆盖不构成端到端测试的排除理由同一边界风险的重复覆盖才构成排除理由——并且应在测试名或邻近文档中写明该风险。避免附带复杂度Avoid Incidental Complexity除非下列模式本身就是被测行为否则应避免在多个层级重复同一场景全局状态重置编排应优先 per-test 状态与清理为单元级断言而引入子进程、监听器、sleep 或真实存储在可观察行为才是契约时断言私有实现形态没有可重复测量与既定工作负载的性能断言。sleep、监听器与真实存储在测试专门针对时序、生命周期、协议或持久化时是恰当的——把 setup 控制在范围内并让原因显而易见。失败、跳过与评审Failures, Skips, and Review.test-skip的使用纪律.test-skip是本地、临时的例外清单每行一个测试名支持正则#开头为注释。纪律如下若某个无关失败已在清单中应上报而不是静默扩大跳过范围新增跳过前记录其跟踪的 issue底层失败修复后移除该跳过。开 PR 前的检查清单纯文档改动运行适用的文档、链接、freshness 与 diff 检查默认不跑完整 Go 套件Go 代码保持聚焦与受影响包测试绿色然后跑一次最终make test只运行改动 surface 要求的那个命名 CI 包装、专用目标或风险门禁——或者复现某个 CI 结果所需的那个。文档改动的验证链文档改动对应的检查由多个脚本组成git diff --check校验空白go test -tagsgms_pure_go ./test/docsync校验文档同步而 scripts/check-doc-freshness.sh 则实施标记式新鲜度策略——为 docs/reference/、docs/getting-started/、docs/integrations/、docs/recovery/、engdocs/ 等参考文档维护一份文档路径 ↔ Freshness source 源码路径映射如docs/reference/configuration.md对应cmd/bd/main.go;cmd/bd/config.go;internal/configfile/检查每份文档是否出现在 engdocs/DOC_INVENTORY.md 中带有Last reviewed: YYYY-MM-DD标记且未超过DOC_FRESHNESS_MAX_AGE_DAYS默认 90 天带有Freshness source:标记且所列源码路径真实存在。这套机制确保文档-源码对照关系不会悄悄失联。从策略到工程实践的要点回顾把TESTING.md的策略落实为日常习惯可以归纳为四条核心纪律层级匹配风险单测缝 → 集成缝 → 端到端缝逐级上升只为了覆盖下层证明不了的独特边界e2e 准入必须同时满足用户可见失败、独特边界风险、下层已覆盖基础行为、无重复边界覆盖四条命令最小化聚焦用-run ^TestExactName$确认用受影响包基线用一次make testCI 复现用对应命名目标文档改动绝不触发全套件环境隔离信任scripts/test.sh的封闭环境隔离 HOME/Git/Dolt、默认跳过 dolt需要可选服务时显式设置BEADS_TEST_ENV_RUN_DOLT1或使用BEADS_TEST_SKIP手工实验一律走一次性临时目录诚实的一致性fake 与生产实现共享语义一致性套件后端对等必须有契约与 conformance 套件背书testing.Short()仅限真实的运行时/压力/大 fixture 跳过。对于想深入源码验证的读者建议依次阅读 scripts/test.sh运行器实现、scripts/ci/lib/test-env.sh隔离环境、Makefile命名目标定义、scripts/check-testing-short.shShort 策略与 backend/conformance/契约套件即可完整还原 Beads 从一条测试命令到整个测试治理体系的全貌。【免费下载链接】beadsBeads - A memory upgrade for your coding agent项目地址: https://gitcode.com/GitHub_Trending/beads1/beads创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表