ARTICLE DETAIL

资讯详情

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

iTerm2 it2 CLI 测试计划实战指南:从会话、窗口到认证与配置的完整验证手册

iTerm2 it2 CLI 测试计划实战指南:从会话、窗口到认证与配置的完整验证手册 桌面应用AI 应用【免费下载链接】iTerm2iTerm2 is a terminal emulator for Mac OS X that does amazing things.项目地址https://gitcode.com/gh_mirrors/it/iTerm2点击查看免费下载it2cli 是 iTerm2 仓库内随附的一个 Swift 命令行工具可执行文件名为it2通过 iTerm2 的 Python API 直接管理会话Session、窗口Window、标签页Tab、Profile、应用级设置、输出监控与认证。本篇以 it2cli/TESTING.md 为核心骨架逐条展开其全部测试场景并结合仓库源码it2cli/Package.swift、it2cli/Sources/it2core 等补充底层实现原理帮助你在真实 iTerm2 环境中完成一次系统性的 CLI 功能验收同时理解每个命令背后的 API 调用链。一、测试前的环境准备1.1 前置条件TESTING.md 明确要求所有测试都必须在iTerm2 内部且已启用 Python API的终端中运行。具体包含两个步骤将编译产物加入 PATHexport PATH/path/to/it2cli/.build/debug:$PATH开启 Python API打开 iTerm2 的Settings General Magic Enable Python API开关。若该开关未开启后续所有命令都会在认证环节失败详见“错误处理”一节的 API disabled 场景。1.2 构建方式结合源码it2二进制由 it2cli/Package.swift 定义的 SwiftPM 包构建而来。该包声明了 macOS 13 平台、一个名为it2的 executable product依赖swift-argument-parser与Yams后者用于解析 YAML 格式的~/.it2rc.yaml配置文件。构建前需先运行 it2cli/setup.sh 创建指向仓库内ThirdParty/ProtobufRuntime与sources/proto的符号链接cd it2cli ./setup.sh swift build # 产物位于 .build/debug/it2从 it2cli/Sources/it2/main.swift 可以看到it2只是一个“瘦驱动”所有逻辑都收敛在it2core库中以便命令树还能以 In-App 方式嵌入 iTerm2 进程内部运行InApp/目录提供了对应的 ProtobufRuntime modulemap。因此你看到的it2 session ...、it2 window ...等命令树在两种运行形态下是一致的。1.3 测试总览按 TESTING.md 的编排测试共分九大类本文将依次展开Session会话命令list / split / run / send / close / restart / focus / read / clear / capture / set-name / set-color / get-var / set-varWindow窗口命令new / list / focus / move / resize / fullscreen / close / arrangeTab标签页命令new / list / select / close / next / prev / goto / moveProfile配置命令list / show / apply / setApp应用命令activate / hide / version / theme / get-focus / broadcast / quitMonitor监控命令output / keystroke / variable / prompt / activityAuth认证命令cookie顶层快捷命令ls / send / run / split / vsplit / clear / new / newtabConfig配置命令config-path / config-reload / load / alias环境变量IT2_APP_PATH / IT2_SUITE / ITERM2_COOKIE / ITERM2_KEY错误处理坏 session ID、API 未开启、非法颜色格式二、Session 命令测试会话Session在 iTerm2 中对应一个 pane窗格。it2 session的完整子命令树定义在 it2cli/Sources/it2core/Commands/SessionCommand.swift除测试计划覆盖的子命令外还包括copy、set-status、get-background-tasks、add-clipping、archive-clippings等。2.1 session listit2 session list期望输出每个会话一行格式为UUID\ttitle行数应等于所有窗口、所有标签页中打开会话的总数。从 SessionCommand.swift 的实现可见该命令通过ITMListSessionsRequest请求 iTerm2遍历响应中每个 window 的 tab 树并用walkSplitTree递归展开每个 tab 的分屏结构最终为每个会话输出id / name / title / size / tty等字段。测试要点核对 UUID 数量与界面上打开的 pane 数量一致。该命令还支持--json输出结构化结果便于脚本消费。2.2 session split水平 / 垂直 / 定向 / 指定 Profile水平分割在当前活动会话中创建右/下方新窗格it2 session split垂直分割it2 session split -v两者都应打印Created new pane: UUID。定向分割对指定会话而非活动会话SESSION$(it2 session list | head -1 | cut -f1) it2 session split -v -s $SESSION这里cut -f1取的就是session list输出的第一列 UUID。-s指定目标会话 ID。指定 Profile 分割PROFILE$(it2 profile list | head -1 | cut -f2) it2 session split -p $PROFILE注意这里取的是profile list的第二列Profile 名称。-p让新窗格使用指定 Profile 的终端配置。2.3 session run 与 session sendrun在窗格中执行命令SESSION$(it2 session split -v | awk {print $NF}) it2 session run -s $SESSION echo hello from it2split -v的输出形如Created new pane: UUIDawk {print $NF}取最后一个字段即新窗格的 UUID。执行后应在新窗格内看到hello from it2。send键入文本但不回车it2 session send -s $SESSION typed without enter与run的本质区别send只向终端输入字符、不发送回车因此文本会停留在提示符处而不会执行。这是模拟人工输入的关键能力也是后续广播broadcast测试的基础。广播到所有会话it2 session send -a broadcast test-a/--all会将文本键入到每一个会话中用于验证批量发送能力。2.4 session close强制关闭-f跳过确认SESSION$(it2 session split | awk {print $NF}) it2 session close -f -s $SESSION期望打印Session closed窗格消失。不强制关闭SESSION$(it2 session split | awk {print $NF}) it2 session close -s $SESSION期望 iTerm2 弹出确认对话框除非用户已在偏好设置中关闭“关闭前确认”。2.5 session restart / focus / read / clear / capturerestart重启会话的 shellSESSION$(it2 session list | head -1 | cut -f1) it2 session restart -s $SESSION期望打印Session restarted该会话的 shell 重新启动。focus将某个会话变为活动窗格SESSION$(it2 session list | tail -1 | cut -f1) it2 session focus $SESSION期望打印Focused session: UUID同时该会话成为活动 pane、其所在标签页被选中、窗口置前。这里用tail -1选取列表中最后一个会话避免与当前活动会话冲突。read读取屏幕内容it2 session read it2 session read -l 5 # 只输出最后 5 行前者打印活动会话的可见屏幕内容后者通过-l限制行数。仓库中 Tests/it2coreTests/SessionReadTests.swift 对读取逻辑有对应单元测试。clear清屏it2 session clear等价于向活动会话发送CtrlL应清空屏幕。capture捕获屏幕到文件it2 session capture -o /tmp/it2-capture.txt cat /tmp/it2-capture.txt rm /tmp/it2-capture.txt期望打印Screen captured to: /tmp/it2-capture.txt并检查文件内容确实包含屏幕快照。-o指定输出路径。2.6 session set-name / set-color修改会话名SESSION$(it2 session list | head -1 | cut -f1) it2 session set-name -s $SESSION Test Name期望打印Session name set to: Test Name标签页/会话标题随之更新。设置标签颜色SESSION$(it2 session list | head -1 | cut -f1) it2 session set-color -s $SESSION #FF0000 # 恢复为黑色 it2 session set-color -s $SESSION #000000期望打印Tab color set to #FF0000且标签变红。颜色使用#RRGGBB十六进制格式若传入非法格式如notacolor应输出错误见“错误处理”一节。2.7 session get-var / set-var变量读写读取变量it2 session get-var session.name期望打印session.name的 JSON 编码值。session.name、session.tty这类内建变量由 iTerm2 通过ITMVariableRequest提供前面 session list 的实现 正是用同样的变量请求机制补齐会话名称与 tty 信息的。写入用户自定义变量SESSION$(it2 session list | head -1 | cut -f1) it2 session set-var user.testVar hello -s $SESSION it2 session get-var user.testVar -s $SESSION期望set-var打印Set user.testVar hello随后get-var打印hello注意 JSON 字符串自带引号。user.*是用户命名空间可自由存取适合作为脚本间的轻量状态传递。三、Window 命令测试窗口命令定义在 it2cli/Sources/it2core/Commands/WindowCommand.swift。窗口 IDwindow_id与会话 UUID 不同通常是自增数字。3.1 window new / listit2 window new期望打印Created new window: window_id并出现新窗口。带 Profile 创建it2 window new -p Default使用名为Default的 Profile 创建新窗口注意这里用的是 Profile 名称而非 GUID。it2 window list期望每窗口一行window_id\tN tabs即窗口 ID 与标签页数量。Tests/it2coreTests/WindowListTests.swift 对窗口列表解析逻辑做了单元测试。3.2 window focus / move / resize聚焦窗口WINDOW$(it2 window list | head -1 | cut -f1) it2 window focus $WINDOW期望打印Focused window: id并将窗口置前。移动窗口WINDOW$(it2 window list | head -1 | cut -f1) it2 window move 100 100 $WINDOW期望打印Moved window to (100, 100)窗口移动到屏幕坐标 (100, 100)注意该坐标为当前显示器的全局坐标。调整窗口大小WINDOW$(it2 window list | head -1 | cut -f1) it2 window resize 800 600 $WINDOW期望打印Resized window to 800x600。3.3 window fullscreenWINDOW$(it2 window list | head -1 | cut -f1) it2 window fullscreen on $WINDOW # 进入全屏 it2 window fullscreen off $WINDOW # 退出全屏 it2 window fullscreen toggle # 切换当前窗口全屏状态on/off针对指定窗口toggle作用于当前窗口。3.4 window close 与窗口布局arrange持久化关闭窗口it2 window new WINDOW$(it2 window list | tail -1 | cut -f1) it2 window close -f $WINDOW期望打印Window closed。tail -1选取刚创建的那个新窗口-f强制关闭。保存 / 列出 / 恢复窗口布局it2 window arrange save test-arrangement it2 window arrange list it2 window arrange restore test-arrangement依次期望打印Saved arrangement: test-arrangement、列表中出现test-arrangement、Restored arrangement: test-arrangement且窗口/标签被完整还原。这是验证 iTerm2 窗口布局持久化能力的关键测试恢复后可继续测试其他命令。四、Tab 命令测试标签页命令定义在 it2cli/Sources/it2core/Commands/TabCommand.swift。4.1 tab new / listit2 tab new期望打印Created new tab: tab_id并在当前窗口出现新标签页。带 Profile 创建it2 tab new -p Defaultit2 tab list期望每标签页一行输出 tab ID、窗口 ID、索引index与会话数。按窗口过滤WINDOW$(it2 window list | head -1 | cut -f1) it2 tab list -w $WINDOW只应列出该窗口内的标签页。4.2 tab select / close选中标签页TAB$(it2 tab list | head -1 | cut -f1) it2 tab select $TAB期望打印Selected tab: id且该标签页变为活动页。关闭标签页it2 tab new TAB$(it2 tab list | tail -1 | cut -f1) it2 tab close -f $TAB期望打印Tab closed。4.3 tab next / prev / goto / moveit2 tab next # 打印 Switched to tab N切换到下一个标签页 it2 tab prev # 返回上一个标签页 it2 tab goto 0 # 选中第一个标签页索引从 0 开始移动标签页到新窗口it2 tab new it2 tab move期望打印Moved tab to new window当前标签页从原窗口分离、进入新窗口。五、Profile 命令测试Profile 命令定义在 it2cli/Sources/it2core/Commands/ProfileCommand.swift注意 Profile 有 GUID 与名称两个标识维度。5.1 profile list / showit2 profile list期望每 Profile 一行GUID\tnameGUID 是第一列、名称是第二列这正是前面 split / apply 测试中cut -f2取名称的原因。Tests/it2coreTests/ProfileListTests.swift 覆盖了该命令的解析。it2 profile show Default期望以key: value键值对形式打印名为Default的 Profile 的全部属性参数名、颜色、字体、快捷键绑定等。5.2 profile apply / set将 Profile 应用到会话PROFILE$(it2 profile list | head -1 | cut -f1) it2 profile apply $PROFILE期望打印Applied profile name to session当前会话立即套用该 Profile 的外观与行为。修改 Profile 属性it2 profile set Default badge-text test badge期望打印Set badge-text test badge for profile Default。TESTING.md 特别强调这会实际修改 Profile 本体而非仅作用于当前会话——也就是说此命令是持久化的写操作测试前请确认不会破坏现有配置建议用一次性测试 Profile 执行。六、App 命令测试应用级命令定义在 it2cli/Sources/it2core/Commands/AppCommand.swift作用于 iTerm2 整体。6.1 activate / hide / version / themeit2 app activate # 打印 iTerm2 activated应用置前 it2 app hide # 打印 iTerm2 hidden应用隐藏点 Dock 图标恢复 it2 app version # 打印 iTerm2 version: version string it2 app theme # 打印 Current theme: theme name it2 app theme dark # 打印 Theme set to: dark it2 app theme automatic # 恢复为自动跟随系统主题取值通常包括dark/light/automatic自动跟随系统外观。6.2 app get-focusit2 app get-focus期望打印当前窗口、标签页、会话的 ID且输出中不应出现Optional(...)包裹——这是验证底层 Swift 可选值正确解包的回归测试点保证输出可直接被cut等工具消费。6.3 app broadcast输入广播先制造两个窗格再开启广播it2 session split -v it2 app broadcast on期望打印Broadcasting enabled for current tab此后在任意一个窗格键入的内容会同时出现在两个窗格中。it2 app broadcast off期望打印Broadcasting disabled。自定义广播组S1$(it2 session list | sed -n 1p | cut -f1) S2$(it2 session list | sed -n 2p | cut -f1) it2 app broadcast add $S1 $S2期望打印Created broadcast group with 2 sessions。与broadcast on当前标签页内所有窗格不同add允许跨窗格/跨标签页指定成员。6.4 app quitit2 app quit警告这会退出 iTerm2。期望打印iTerm2 quit command sent。Tests/it2coreTests/AppQuitTests.swift 对该命令的请求构造有对应测试。建议将此场景放到整套测试的最后执行或在无其他任务的测试环境中进行。七、Monitor 命令测试长驻命令Monitor 命令定义在 it2cli/Sources/it2core/Commands/MonitorCommand.swift用于订阅 iTerm2 的实时事件。它们都是长驻进程测试完用CtrlC终止。仓库中的 Tests/it2coreTests/MonitorOutputTests.swift 对输出监控的事件处理有单元测试支撑。7.1 monitor outputit2 monitor output注意与session read的区别该命令打印一次当前屏幕内容后立即退出可视为流式输出接口的快照模式。跟随模式it2 monitor output -f MONITOR_PID$! # 在另一个窗格中执行若干命令 kill $MONITOR_PID-f/--follow会持续打印屏幕更新测试时先在后台启动再到其他窗格操作最后 kill 掉后台进程。模式过滤it2 monitor output -p ERROR-p/--pattern只打印匹配ERROR的行适合日志跟踪场景。7.2 monitor keystrokeit2 monitor keystroke测试时键入若干按键每个按键应输出一行Keystroke: charCtrlC结束。7.3 monitor variable会话级变量监听it2 monitor variable session.name通过偏好设置或it2 session set-name改变会话名应打印Changed to: new value。应用级变量监听it2 monitor variable effectiveTheme --app-level--app-level将监听范围提升到整个应用改变主题后应打印新值。7.4 monitor prompt依赖 Shell Integrationit2 monitor prompt前提被监控会话必须已启用 Shell Integration即 shell 启动脚本已加载。在会话中运行命令时应依次看到New prompt detected—— 出现新提示符Command started: cmd—— 命令开始执行Command finished (exit status: N)—— 命令结束并携带退出码这是对 iTerm2 Shell Integration 事件的直接订阅也是自动化任务编排的基础。7.5 monitor activity焦点活动it2 monitor activity -a在不同会话间切换焦点应打印Session active: name获得焦点与Session idle: name失去焦点。八、Auth 认证命令测试认证是 it2 CLI 与 iTerm2 建立授权通道的关键环节实现位于 it2cli/Sources/it2core/Auth/CookieAuth.swift 与 it2cli/Sources/it2core/Commands/AuthCommand.swift。8.1 auth cookie可复用 cookieit2 auth cookie运行后 iTerm2 会话内应出现授权公告提供24 Hours、Forever、Always Allow All Apps、Deny等选项选择24 Hours后命令打印ITERM2_COOKIEcookie ITERM2_KEYkey验证 cookie 生效性能对比export $(it2 auth cookie) time it2 session list /dev/null期望耗时约10ms而非未认证时的约 140ms——速度差异来自绕过了每次都要执行的 AppleScript 授权流程。验证复用time it2 session list /dev/null time it2 session list /dev/null连续多次执行都应保持毫秒级。从 CookieAuth.swift 的实现可以确认认证器优先检查ITERM2_COOKIE环境变量只有环境变量缺失时才回退到 AppleScript 申请 cookie。8.2 auth cookie单次使用it2 auth cookie --single-use应直接打印 cookie 且不弹出公告窗口适合脚本内匿名调用。8.3 关于远程路径的补充从 it2cli/Sources/it2core/IT2.swift 的源码注释可以看出设计意图auth命令子树被标记为RemoteForbiddenCommand——因为可复用的ITERM2_COOKIE/ITERM2_KEY一旦经 SSH 远程通道泄露就绕过了 iTerm2 按会话授予、可撤销的 API 权限。因此在嵌入式 / over-SSH 路径下it2 auth ...会被整体拒绝防止 cookie 流出本机。这是安全设计上的一个值得注意的细节。九、顶层快捷命令为贴近 Python 版it2的使用习惯CLI 提供了一组顶层快捷命令实现位于 it2cli/Sources/it2core/Commands/ShortcutCommands.swift。它们本质上是把参数重新组装后转发给对应的完整子命令例如SendShortcut将text、-s、-a转给Session.Send。快捷命令等价完整命令it2 lsit2 session listit2 send helloit2 session send helloit2 run echo shortcut testit2 session run echo shortcut testit2 split/it2 vsplitit2 session split/it2 session split -vit2 clearit2 session clearit2 newit2 window newit2 newtabit2 tab new测试时逐条运行并比对输出与等价命令是否一致。十、Config 命令测试~/.it2rc.yamlConfig 命令定义在 it2cli/Sources/it2core/Commands/ConfigCommand.swift负责加载用户主目录下的~/.it2rc.yamlYAML 解析依赖Package.swift中的 Yams 库。仓库内 Tests/it2coreTests/ConfigReloadTests.swift 对配置重载逻辑有单测覆盖。10.1 config-pathit2 config-path打印~/.it2rc.yaml的路径及该文件当前是否存在。10.2 config-reload先创建测试配置cat ~/.it2rc.yaml EOF profiles: test: - command: echo loaded from config aliases: hello: session run echo hello from alias EOF然后it2 config-reload期望打印Configuration reloaded并列出加载到的 profiles 与 aliases。10.3 load 与 aliasit2 load test期望打印Loading profile: test并依次执行该 profile 中定义的命令此处为echo loaded from config。it2 alias hello期望打印Running alias hello: session run echo hello from alias并实际执行该命令。清理rm ~/.it2rc.yaml测试完成后删除临时配置避免污染后续使用。提示这里文档使用rm清理的是用户自己创建的临时测试文件并非仓库文件。十一、环境变量测试11.1 IT2_APP_PATHIT2_APP_PATH/Applications/iTerm.app it2 session list用于指定 iTerm2 应用的路径以便 AppleScript 认证流程定位正确的应用实例例如多版本并存或非标准安装路径时。11.2 IT2_SUITEIT2_SUITEiTerm2 it2 session list指定连接~/Library/Application Support/iTerm2/private/socket这个 Unix domain socket换一个值就连接到不同的 socket 路径。这一机制让同一套二进制可以在多套 iTerm2 数据目录如 beta 版与正式版之间切换与 Transport/APIChannel.swift 中“SocketChannel通过 iTerm2 本地 Unix domain socket 通信”的实现对应。还需注意 IT2Context.swift 中的设计约束在 SSH 授权提示这类受限模式下部分命令会被拒绝。11.3 ITERM2_COOKIE / ITERM2_KEYexport $(it2 auth cookie --single-use) it2 session list unset ITERM2_COOKIE ITERM2_KEY第一次session list应从环境变量直接读取 cookie毫秒级无公告弹窗unset之后应回退到 AppleScript 流程。结合第八节的源码可以串起完整链路环境变量 → 单次 AppleScript 授权 → 建立 socket 通道。十二、错误处理测试错误路径是 CLI 健壮性的试金石相关错误类型定义在 it2cli/Sources/it2core/IT2Error.swift。12.1 无效的 session IDit2 session run -s nonexistent-uuid echo test期望打印错误信息并以非零退出码结束可用echo $?验证。12.2 API 未开启在设置中关闭 Python API然后it2 session list期望打印连接或认证错误。这验证了前置条件“Enable Python API”的必要性。12.3 非法颜色格式it2 session set-color -s $(it2 session list | head -1 | cut -f1) notacolor期望打印关于颜色格式非法的错误信息验证#RRGGBB格式校验逻辑。十三、测试编排建议综合 TESTING.md 的编排顺序推荐按以下依赖关系组织测试流水线准备阶段setup.shswift build、配置 PATH、开启 Python API。快速冒烟it2 session list、it2 app version、it2 app theme确认通道与认证可用。对象创建session split→window new→tab new获得测试用 UUID/ID。功能验证按会话 → 窗口 → 标签页 → Profile → 应用 → 监控 → 配置的顺序逐条执行注意session run依赖 split 产生的会话、broadcast add依赖至少两个会话。持久化验证window arrange save/restore与config-reload。错误路径坏 ID、非法颜色、关闭 API 后的连接失败。收尾app quit置于最后、清理/tmp/it2-capture.txt与~/.it2rc.yaml。需要特别留意两个“破坏性”命令it2 profile set会持久修改 Profile 本体与it2 app quit会退出 iTerm2务必在独立测试环境中执行。结语本测试计划覆盖了 it2 CLI 从对象管理会话/窗口/标签页、配置管理Profile /~/.it2rc.yaml、实时监控输出/按键/变量/提示符/焦点到认证cookie 机制与错误路径的完整功能面。结合源码可知整条链路建立在三个技术支柱之上基于 protobuf 的 API 协议sources/proto 中的Api.proto定义消息格式、本地 Unix domain socket 通道Transport/APIChannel.swift、以及环境变量优先、AppleScript 兜底的认证策略Auth/CookieAuth.swift。逐条跑完这套用例你不仅能验收 CLI 的全部能力也能为基于 iTerm2 的自动化脚本建立可复用的验证基线。赞分享桌面应用AI 应用【免费下载链接】iTerm2iTerm2 is a terminal emulator for Mac OS X that does amazing things.项目地址https://gitcode.com/gh_mirrors/it/iTerm2点击查看免费下载相关推荐Playwright 复杂认证流程测试从邮件验证、密码重置到会话超时与登出的完整实战指南Playwright 复杂认证流程测试从邮件验证、密码重置到会话超时与登出的完整实战指南 本文聚焦 Playwright 中 复杂认证流程 的端到端测试实践CMS前端Cloudflare Wrangler 完全指南从安装、认证到部署与测试的 CLI 实战手册Cloudflare Wrangler 完全指南从安装、认证到部署与测试的 CLI 实战手册 Wrangler 是 Cloudflare 开发者平台的官方 C人工智能AI 技能AI 插件Baserow AI Assistant 测试计划从单元测试到端到端手工验证的完整实战指南Baserow AI Assistant 测试计划从单元测试到端到端手工验证的完整实战指南 本指南围绕 Baserow 开源仓库中 AI Assistant后端前端数据库低代码工作流自动化上一篇老Mac升级新系统四步走免费的完整操作指南下一篇解放磁盘空间dupeGuru自定义命令批量清理下载文件夹终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表