Mole 源码仓库如何配置 MOLE_TEST_NO_AUTH 与 TERM 环境变量跑通完整 Bats 测试套件
【免费下载链接】Mole🐹 Clean, uninstall, analyze, optimize, and monitor your Mac. Free open-source CLI, plus a native Mac app.项目地址: https://gitcode.com/GitHub_Trending/mole15/Mole
如果你要在 Mole 的源码仓库里验证 shell 改动,需要跑完整个 Bats 测试套件,但直接后台或裸跑./scripts/test.sh经常会遇到两类问题:测试触发了真实的 sudo / Touch ID 授权提示而卡住,或者日志中途截断、退出码非零,看起来像测试挂了。仓库约定的解法是把MOLE_TEST_NO_AUTH=1与TERM=xterm-256color两个环境变量放进运行命令里。这篇文章基于仓库中的 AGENTS.md、scripts/test.sh、docs/SECURITY_DESIGN.md 与 CONTRIBUTING.md,说明如何配置这两个变量并验证套件完整跑完。
准备条件
Mole 的 shell 代码面向 macOS(Bash 3.2+ 兼容),scripts/test.sh的第 6 步安装测试只在 macOS 上执行,非 macOS 平台会打印Installation test skipped (non-macOS)并跳过。CONTRIBUTING.md 给出的开发依赖安装命令:
brew install shfmt shellcheck bats-core golangci-lint其中bats是运行套件的前提,shellcheck用于测试脚本的 lint 步骤(缺失时该步骤跳过但会告警)。套件的第 3 步会运行go test ./...,机器上没有 Go 时这一步跳过;要完整执行则按 CONTRIBUTING.md 的要求安装 Go 1.24+。
另有一个 CI 相关限制:在CI=true或GITHUB_ACTIONS=true环境下,scripts/test.sh会检查gtimeout或timeout是否存在,缺失时直接退出,提示Install coreutils to provide gtimeout。本地运行不受此检查影响。
MOLE_TEST_NO_AUTH 做了什么
docs/SECURITY_DESIGN.md 的 Layer 5 对它的定义是:MOLE_TEST_NO_AUTH=1会让 Mole 拒绝调用sudo、osascript、launchctl以及任何会弹出授权提示的路径,bats 与集成测试要求开启该变量。
除了代码里的守卫(如 lib/core/sudo.sh 中request_sudo_access在检测到该变量时直接返回失败),scripts/test.sh还做了双重保险:它自己会export MOLE_TEST_NO_AUTH=1,并在一个临时目录里生成sudo、osascript、launchctl三个 stub 脚本放进PATH最前面——stub 被调用时会打印类似mole test blocked sudo: ...的报错并退出非零,而不是静默通过。也就是说,即使某个测试路径忘了带守卫,stub 也会大声失败而不是真的去要密码。
AGENTS.md 的 Critical Safety Rules 把这条规则写成硬性要求:测试、手工复现和验证都使用MOLE_TEST_NO_AUTH=1,除非你明确在测真实的授权行为;任何新增的sudo、osascript、launchctl直接调用必须有MOLE_TEST_MODE/MOLE_TEST_NO_AUTH守卫或在测试中完全 mock。
跑完整套件的主路径命令
仓库验证清单里给出的完整套件命令(AGENTS.md Verification 一节):
TERM=xterm-256color MOLE_TEST_NO_AUTH=1 ./scripts/test.sh为什么两个变量都要显式带上,尽管 scripts/test.sh 内部会export MOLE_TEST_NO_AUTH=1,并且在TERM为空时自动补export TERM="xterm-256color"?AGENTS.md 给出的原因是:后台运行的./scripts/test.sh继承不到 TTY,tput会失败,bats validator 会在中途因管道断开而死掉,留下截断的日志和一个非零退出码,看起来像一整套红色失败,而它只是环境问题。文档明确说:TERM=xterm-256color MOLE_TEST_NO_AUTH=1 ./scripts/test.sh可以跑到完成,这种情况应归类为 setup 问题,而不是产品失败。Makefile 里封装的等价入口是:
make testMakefile 中test目标即MOLE_TEST_NO_AUTH=1 ./scripts/test.sh。
套件实际执行了什么
跑之前了解各步骤的副作用,来自 scripts/test.sh 正文:
- 清理超过 60 分钟的遗留
tests/tmp-*目录,并生成一个临时目录存放sudo/osascript/launchctlstub(退出时自动清理); - 用
shellchecklint 所有tests/*.bats与tests/*.sh; - 运行 Bats 单元测试。
tests/installer_fd.bats只在装了fd时纳入,tests/installer_zip.bats只在装了zip(及zipinfo/unzip)时纳入;当 bats 支持--jobs且系统有parallel或rush时并行执行(默认上限 6 个 job),带时序断言的core_performance.bats、regression.bats被拆到并行批次结束后串行执行; - 运行
go build、go vet、go test ./...(无 Go 则跳过); - 验证
lib/core/common.sh可正常加载,并对mole、bin/clean.sh、bin/optimize.sh做bash -n语法检查; - 在 macOS 上以临时
HOME与--prefix实际执行一次install.sh(临时目录在结束后清理;若 Homebrew 版 mole 已安装则跳过,因为install.sh拒绝覆盖)。
此外脚本会unset NO_COLOR,因为测试断言确定性的 ANSI 转义输出,宿主机 shell 里设置的NO_COLOR会干扰这些断言。
开发过程中的定向测试
AGENTS.md 的工作规则是:开发中优先跑定向 Bats 测试,提交前再跑完整套件。单个测试文件的命令形态:
MOLE_TEST_NO_AUTH=1 bats tests/clean_core.bats该文档的 Hotspot Ownership 一节按代码区域列出了对应的定向测试命令,例如改动lib/clean/project.sh(purge 逻辑)时跑:
MOLE_TEST_NO_AUTH=1 bats tests/purge.bats tests/purge_config_paths.bats改动lib/core/file_ops.sh等文件操作代码时跑:
MOLE_TEST_NO_AUTH=1 bats tests/file_ops_mole_delete.bats tests/file_ops_size.bats tests/file_ops_safe_remove_symlink.bats tests/user_file_ops.bats tests/core_safe_functions.bats改动 shell 代码的完整验证顺序是:先./scripts/check.sh --format(格式化加 lint),再跑对应 Bats 测试或完整套件。
如何判断套件跑通了
scripts/test.sh 的退出逻辑很直接:所有步骤计数失败数为 0 时打印All tests passed!并退出 0;否则打印$FAILED tests failed!并退出 1。判定成功时按 AGENTS.md 的要求操作:
- 读套件自己的 summary 行,不要自己数条数。脚本把有时序敏感的文件拆到独立的串行 Bats 运行中,TAP 输出与主并行批次不同,按一个前缀去数会漏计。裁判是 runner 的 summary 和退出码,自己算的计数要与之对账。
- 不要把测试输出管道接给
tail或head。管道会报告 pager 的退出码,红色运行会读成绿色。要么完整打印,要么落盘到文件后单独检查状态。 - 如果日志截断且退出非零,先确认是否就是
TERM缺失 / 无 TTY 导致的 validator 管道断开——按文档说法把它归为 setup 问题,补上TERM=xterm-256color重跑,而不是当作测试失败去排查产品代码。
限制与边界
- 第 6 步安装测试仅 macOS;在其他平台跑完整套件时该步跳过,其余步骤仍然执行。
- 并行 Bats 需要 bats 支持
--jobs且系统存在parallel或rush;不满足时退化为串行,套件照常完成。 MOLE_TEST_NO_AUTH的意义是让测试不触碰真实授权;如果你要测的就是真实授权行为,才允许不带该变量(AGENTS.md:unless real auth behavior is being tested)。
完成一次绿色运行后的下一步在 CONTRIBUTING.md 中定义:提交前再跑./scripts/check.sh确认格式与 lint,CI 会验证 formatting、linting 和测试。
【免费下载链接】Mole🐹 Clean, uninstall, analyze, optimize, and monitor your Mac. Free open-source CLI, plus a native Mac app.项目地址: https://gitcode.com/GitHub_Trending/mole15/Mole
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考