数据分析CLI数据可视化【免费下载链接】visidataA terminal spreadsheet multitool for discovering and arranging data项目地址https://gitcode.com/gh_mirrors/vi/visidata点击查看免费下载导读本篇文章以 VisiData 仓库中的 dev/checklists/manual-tests.md 为骨架系统梳理 VisiData 在发布前需要人工验证的 31 项核心功能覆盖 cmdlog 录制与回放、长命令名执行、系统剪贴板、绘图与图片加载、大数据集、URL 加载、分屏窗口、外部编辑器联动、覆盖保存、宏录制、聚合器、批量模式与光标滚动等主题。通过结合 visidata/cmdlog.py、visidata/splitwin.py、visidata/_input.py、visidata/save.py 等源码实现与 visidata/tests 目录下的自动化测试读者将掌握每一项功能的手动验证方法、底层工作机制、已知边界问题bug以及哪些部分已被 CI 自动化覆盖、哪些仍依赖人工兜底。1. 清单背景为什么需要「人工测试清单」VisiData 是一个以交互为核心的终端电子表格工具绝大多数功能命令、快捷键、宏、分屏、编辑器联动依赖 curses 终端交互天然难以被纯单元测试覆盖。仓库中的tests/目录与test-*.sh脚本自动化了大量加载、保存、命令回放路径但仍有以下场景必须依赖人工验证真实网络与 TLS本地 loopback 测试无法模拟真实 HTTPS 站点的 TLS 握手、重定向与动态 HTML。真实终端按键序列例如编辑单元格时按下CtrlO唤起$EDITOR并取回结果的按键链路只有真实终端才能完整复现。多窗格分屏的栈结构行为Z/gZ/zZ/gTab涉及 sheet 栈的跨窗格搬移自动化难以断言视觉与栈结构。性能感知批处理耗时、大数据集滚动流畅度等需要人工体感验证。因此 dev/checklists/manual-tests.md 以编号列表形式成为每次发布前的最终人工验收关卡。2. cmdlog 录制与回放清单第 1 项2.1 录制机制VisiData 的全局命令日志cmdlog由 visidata/cmdlog.py 实现。每条可回放命令在执行时被写入 cmdlog 表其核心判定逻辑是isLoggableCommand()与isLoggableSheet()isLoggableCommand返回命令是否应被记录取决于命令是否带replayFalse前缀或被列入非记录集合visidata/cmdlog.py 中的nonLogged列表isLoggableSheet排除 cmdlog 自身、OptionsSheet、ErrorSheet等内部工作表避免记录记录本身的递归visidata/cmdlog.py 第 85 行附近。除全局 cmdlog 外每个 sheet 还有独立的cmdlog_sheet因此open_vdj/save_vdj可以按 sheet 粒度保存/恢复操作轨迹。2.2 人工验证点清单要求逐项验证选项options的日志记录执行set-option类命令后确认选项变更出现在 cmdlog 行中选项记录依赖replayableOption与Settings.set(..., cmdlogTrue)机制。行与列的日志记录对行、列的操作如add-row、add-column应被完整记录。空 sheet / 空行 / 空列的回放当 cmdlog 中某条记录缺少 sheet、row 或 column 上下文时回放应作用于当前sheet、row、column——这正是moveToReplayContext(vd, r, vs)的职责visidata/cmdlog.py它读取回放行中记录的 sheet/row/col 位置缺失部分则落回当前游标。中止abort回放过程中按Esc等键应中止后续命令源码中replay_cancel(vd)与replayOne内if escaped:分支会提示replay aborted during longnamevisidata/cmdlog.py。批量模式batch mode清单给出两条命令验证顺序无关性bin/vd -b -p tests/append.vd bin/vd -p tests/append.vd -b-bbatch与-pplay cmdlog 文件组合时无论参数顺序如何回放结果应当一致。回放执行的调度核心是vd._nextCommands.extend(cmdlog.rows)visidata/cmdlog.py 中的replay(vd, cmdlog)命令会被排队依次执行。回放相关选项visidata/cmdlog.py 第 7-8 行replay_wait回放命令之间的等待秒数默认0.0replay_ignore_errors是否在回放出错时继续而非中止默认False即出错即中止。2.3 自动化覆盖现状cmdlog replay的大部分路径已被自动化覆盖tests/下存在大量.vd/.vdj回放脚本与对应 golden 输出例如 tests/append.vd、tests/sortorder.vdj、tests/freq-summary.vd配合dev/test-all.sh、tests/test-vdx.sh等脚本运行。人工测试主要补足真实终端下的中断/恢复、空上下文回放等交互细节。3. 长命令名执行与系统剪贴板清单第 4、5 项longname-exec第 4 项VisiData 每个命令都有唯一的长命令名longname如splitwin-half、save-sheet。人工验证长命令名能通过:命令行直接执行且结果与快捷键触发一致。命令定义统一走addCommand(keystrokes, longname, execstr, helpstr, replayTrue)接口visidata/settings.py 中的addCommandreplayTrue保证长命令名执行也会被 cmdlog 记录并可回放。syscopy第 5 项系统剪贴板复制。实现位于 visidata/clipboard.py核心函数为syscopyValue、syscopyCells、syscopyCells_asynctests/test_commands.py中syscopy被列入自动化命令测试visidata/tests/test_commands.py。人工验证重点在无 X 剪贴板的纯终端如 SSH 会话下复制行为是否优雅降级依赖vd.copyToClipboard的兜底实现见 visidata/deprecated.py 的copyToClipboard。4. 绘图与图片加载器清单第 6 项清单要求验证plots 与图片加载器如 png并特别关注plot 与鼠标mice之间的关系。绘图能力由 visidata/canvas.py 与 visidata/graph.py 提供Canvas负责像素绘制plotpixel、plotline、plotlabel、plotlegendGraphSheet在其上叠加坐标轴、参考线与缩放zoomTo、resetBounds。鼠标交互plotterMouse()、plotterCursorBox()将终端鼠标坐标换算为画布坐标canvasMouse()与go_mousevisidata/mouse.py配合实现拖拽、缩放、平移。人工验证时应重点测试在图形上拖动鼠标是否平滑跟随游标、点击是否准确命中所选数据点、缩放框选是否与视觉一致。图片加载png 等位图通过loaders下的加载器读入为像素行与绘图共用 Canvas 渲染管线。可先用sample_data/vdlogo-160x24.png这类小图验证加载与逐像素显示。5. 大数据集测试清单第 10 项311清单以311数据集为代表验证大表格的加载、滚动与操作性能。仓库sample_data/与tests/中对应场景包括tests/issue350.vdj、tests/issue655.vdx、tests/issue733.vd等多为 311 相关 issue 回归以及tests/test-perf.sh性能脚本。人工验证要点加载大文件时底部状态栏出现异步进度条Progress机制visidata/threads.py上下滚动、PgDn翻页、列宽自适应在大数据集下不卡顿对大数据集执行freq、pivot、join等重操作时界面保持响应、可随时中止cancelThread/EscapeException。6. URL 加载清单第 15、22 项清单区分了已自动化与仍需人工的 URL 场景已自动化HTTP URL 加载与 open-row 跟随 HTML 链接通过tests/test-url.sh针对 loopback 服务器完成相关用例见 tests/url 目录page.html、usage.tsv。人工残余真实外网 HTTPS URL例如https://visidata.org/usage.tsv——覆盖 TLS 真实网络的组合CI 无法触达真实外网 HTML 页面上的open-row例如 NASA 数据页或维基百科页——验证open-row跟随链接的机制在真实 HTML 下的表现机制本身已由tests/test-url.sh自动化。URL 路径的底层支持见 visidata/path.pyPath通过scheme()、is_url()、open_text()/open_bytes()抽象出网络文件句柄加载器据此复用与本地文件一致的读取链路。网络缓存由 visidata/_urlcache.py 的urlcache()提供默认缓存 1 天。7. 分屏窗口清单第 16 项——本清单最重的验证块分屏由 visidata/splitwin.py 单独实现含 5 个命令与 1 个选项快捷键longname行为Zsplitwin-half确保分屏开启并把下层 sheet 推入另一窗格默认 50%gZsplitwin-close关闭分屏重置所有 pane 与disp_splitwin_pctTabsplitwin-swap跳到非活动窗格gTabsplitwin-swap-pane交换窗格在屏幕上的上下位置zZsplitwin-input以输入提示设置分屏百分比选项disp_splitwin_pct第二个 sheet 在屏幕上的高度百分比默认 0关闭核心实现splitPane(sheet, pct)visidata/splitwin.py 第 10-17 行若当前活动栈还有第二层 sheet则取undersheet.pane的另一侧 pane 编号vd.push(undersheet, panepane)将其推入另一窗格并切换vd.activePane。窗格归属记录在sheet.pane属性默认 1vd.activePane 1表示活动窗格编号从 1 起。7.1 清单要求的三个子测试测试 1关闭后栈可访问打开 2 个文件 →Z→ 确认第一个窗口pane 1处于活动 →Tab切换 → 分别尝试关闭上/下窗格确认关闭分屏后splitwin_close把所有pane重置为 1两个窗格中的所有 sheet 都能在结果栈中访问。测试 2ColumnsSheet 分屏栈行为打开 2 个文件 →Z→ 在一侧打开ColumnsSheet→ 再Z→ 检查 sheet 栈columns sheet 应保持在原位而其下层的源 sheet 应被移动到另一窗格的栈顶。清单还记录了一个已知 bug在底部窗格按ShiftZ时其第二个 sheet 会变成顶部栈的第二个 sheet而非顶部栈的第一个 sheet——验证时需在两侧各复现一次确认该 bug 的触发范围。测试 3单文件与单层栈边界仅一个文件时按ShiftZ或两个窗格各自的栈都只有一个 sheet 时按ShiftZ均不应产生异常或空窗格。7.2 窗格操作专项gZsplitwin-close两个窗格都要测试关闭后移动光标界面不应出现闪烁flickering再按Z重新分屏两侧行为一致。zZsplitwin-input应只改变窗口尺寸不改变其他任何状态正负值都要测试。清单标注一个疑似 bug负值会导致窗格归属互换gTab的实现即disp_splitwin_pct -disp_splitwin_pct负值天然被用作交换语义需人工确认这是特性还是缺陷。gTabsplitwin-swap-pane应交换两个窗格两个窗格都要测试。另一个疑似 bug第二个窗格尺寸较小时交换后是否应围绕光标位置重新定向——这是待人工确认的交互细节。活动窗格内的光标在两个窗格中分别移动光标确认输入焦点与高亮始终跟随vd.activePane。8. 外部编辑器联动edit-cellCtrlO清单第 18 项8.1 工作机制单元格编辑时按CtrlO会启动$EDITOR编辑当前值并取回结果。按键处理在 visidata/_input.py 第 276-283 行elif ch CtrlO: edit_v vd.launchExternalEditor(v) if self.value edit_v: raise EscapeException(ch) # 编辑器未改动单元格保持不变 else: self.value edit_v return True # 编辑器改动了内容接受新值launchExternalEditor的完整链路visidata/editor.py用TempFile()创建临时文件写入当前单元格值第 47-50 行launchExternalEditorPath调用launchEditor(path, linenum)——launchEditor读取$EDITOR环境变量未设置则vd.fail($EDITOR not set)在SuspendCurses()上下文先curses.endwin()退出窗口模式结束后reset_prog_mode()恢复中subprocess.call启动编辑器第 26-32 行编辑器退出后重新读取临时文件内容rstrip(\n)去掉编辑器必然追加的末尾换行返回作为单元格新值第 62-67 行。8.2 自动化覆盖与人工残余清单明确指出launch readback 机制已在visidata/tests/test_editor.py自动化该测试用假$EDITOR脚本验证launchExternalEditor(hello) EDITED-hello等场景见 visidata/tests/test_editor.py只有编辑器内部的CtrlO按键本身需要人工验证——即真实编辑器vim/nano 等会话内触发确认保存退出后单元格确实取回编辑结果且编辑器未改动时单元格保持不变。9. 覆盖保存overwritec清单第 19 项清单要求以overwritec保存到已存在文件时出现file exists. overwrite?提示输入y/n应分别真正覆盖/中止。9.1 底层实现选项定义于 visidata/modify.py 第 10 行overwrite默认值c取值语义为ccheck询问确认、nno/readonly禁止覆盖并通过optalias提供readonly/ro别名。核心逻辑couldOverwrite(vd)overwrite以c或y开头才可能允许覆盖第 18-20 行confirmOverwrite(vd, path, msg)路径不存在直接放行否则按选项分支——n开头直接vd.fail(overwrite disabled)c开头弹出{path.given} exists. overwrite?确认框vd.confirm在用户回答y时通过、n/Esc时抛出EscapeException中止第 24-35 行。保存流程saveSheets(vd, givenpath, *vsheets, confirm_overwriteTrue)visidata/save.py 第 124-173 行在确定 filetype 后调用vd.confirmOverwrite(givenpath)save-sheet-really命令则显式传confirm_overwriteFalse实现不询问直接存。9.2 自动化覆盖清单注明覆盖保存的其余路径——fallback无对应 saver 时回退默认格式见save.py第 164-170 行、block多 sheet 保存到非目录时vd.fail、overwritey/n、多 sheet 保存——已由tests/test-save.sh与tests/test-filetype.sh自动化。人工只需验证真实终端下提示框的y/n交互。10. 宏录制与聚合器清单第 21、24 项宏录制第 21 项验证startMacro→ 操作 →saveMacro的完整链路。实现见 visidata/macros.py宏本质上是复用了 cmdlog 的录制行afterExecSheet把命令写入宏 cmdlogsetMacro/runMacro/loadMacro负责绑定快捷键、执行与从.vd文件装载。人工验证录制一段包含选择、排序、新增列的操作保存为宏后在新会话中重放结果应与录制时一致tests/macros/test_macro.vd提供了可参考的宏文件样例。多个聚合器通过 palette添加第 24 项验证在ColumnsSheet上按addcol-aggregate弹出聚合器选择面板可连续选择多个聚合器如 sum、mean、min、max、count、stdev 等一次添加到当前列。聚合器注册体系在 visidata/aggregators.pyaggregator()/aggregator_list()注册聚合函数chooseAggregators()提供交互选择addAggregators(sheet, cols, aggrnames)批量添加memo_aggregate缓存分组结果。tests/aggregators-cols.vdj、tests/aggregators-set.vd、tests/aggregators-errors.vd等脚本验证了对应行为。11. 批处理与z;管道命令清单第 25、26、27 项第 25 项性能基准计时运行time vd -p tests/quit-nosave.vdj并记录耗时与 PR #2369 的基准对比用于监控启动与退出的性能回归。性能测试脚本参见tests/test-perf.sh与dev/PERFORMANCE.md。第 26 项z;管道使用z;命令后输入一条命令例如echo | Ceci nest pas une pipe验证 shell 管道执行z;触发exec_shellvisidata/shell.py 的inputShell与exec_shell把命令输出转化为行addShellColumns可为输出追加 shell 列带引号的竖线|应作为字面字符传给 shell验证转义处理。第 27 项batch inline 双加载可编辑性vd -b -i -p tests/fill.vdj sample_data/a.tsv-i表示 inline加载后停留在首行数据并立即接受编辑而非进入帮助页-b表示 batch无交互。清单要求确认benchmarktests/fill.vdj产生的填充表与sample_data/a.tsv两个 sheet 都是可编辑的——即 inline 模式下即使批处理回放结束工作表中的数据仍允许修改hasBeenModified/修改追踪见 visidata/modify.py。12. 光标与滚动行为清单第 28-31 项最后一组为纯交互验证涉及cursorDown、页翻页与窗口滚动逻辑visidata/movement.py、visidata/sheets.py 的topRowIndex/bottomRowIndex/cursorDown第 28 项连续按j滚动到底部验证最后一行的显示与底部边界。第 29 项从第 1 行按PgDn应停在顶部并恰好向前翻一页——验证pageLeft/翻页语义与恰好一页的取整。第 30 项先3xj移动 3 行再PgDn光标相对位置应保持——即翻页后光标仍停留在相对相同的行位验证topRowIndex与游标行的联动计算。第 31 项ZZ退出验证退出时对未保存修改的确认提示confirmQuitvisidata/sheets.py与quit.vdx等退出脚本的兼容性。13. 自动化与人工测试的分工总览结合清单标注与仓库测试布局可以得出如下分工功能自动化覆盖人工残余cmdlog replaytests/*.vd/.vdj golden 输出空上下文回放、中止交互URL 加载tests/test-url.shloopback真实 HTTPS/TLS、真实 HTML open-row编辑器联动visidata/tests/test_editor.py编辑器内CtrlO按键覆盖保存tests/test-save.sh、tests/test-filetype.shfile exists. overwrite?的 y/n 交互分屏窗口无专门自动化全部 5 个命令 × 多窗格组合光标/滚动部分命令测试翻页相对位置等体感验证发布流程参考 dev/checklists/release.md人工测试清单通常作为 release 流程的最终关卡与 dev/checklists/feature.md新功能自检和 dev/checklists/add-command.md新增命令自检配合使用新命令应自带自动化测试而本清单聚焦于跨模块交互与真实环境行为。14. 结语dev/checklists/manual-tests.md虽然只是一份编号清单却精确刻画了 VisiData 中最人工密集的功能面cmdlog 回放的正确性、分屏窗口的栈结构、外部编辑器的双向通信、覆盖保存的交互语义。每一行都对应着 visidata 目录中可考的源码实现与tests/下的自动化边界。对照源码执行这份清单既是发布前的验收也是深入理解 VisiData 事件调度、sheet 栈与终端交互模型的绝佳路径。赞分享数据分析CLI数据可视化【免费下载链接】visidataA terminal spreadsheet multitool for discovering and arranging data项目地址https://gitcode.com/gh_mirrors/vi/visidata点击查看免费下载相关推荐Windows Calculator 手动测试全指南从 Smoke 测试到回归验证的发布前检查清单Windows Calculator 手动测试全指南从 Smoke 测试到回归验证的发布前检查清单 导读 ManualTests.md https://lin桌面应用Thunderbird for Android 发布前手动测试清单从 Smoke 快速回归到全量 Release 验证Thunderbird for Android 发布前手动测试清单从 Smoke 快速回归到全量 Release 验证 导读 本文完整解析 Thunderbi移动开发企业应用ISO3166 PHP库常见问题解答解决90%开发者遇到的集成难题ISO3166 PHP库常见问题解答解决90%开发者遇到的集成难题 ISO3166 PHP库是一个提供ISO 3166 1数据的PHP工具包帮助开发者轻松处上一篇Oh My Zsh配置即代码使用插件管理实现版本化终端配置下一篇革命性动态配置工具django-constance5分钟实现Django设置热更新创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
