ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CLI-Anything WaveTone Harness 测试计划与验证报告:32 项测试如何锁定音频转写 Agent 的可靠边界

CLI-Anything WaveTone Harness 测试计划与验证报告:32 项测试如何锁定音频转写 Agent 的可靠边界 CLI-Anything WaveTone Harness 测试计划与验证报告32 项测试如何锁定音频转写 Agent 的可靠边界【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything导读本文围绕 CLI-Anything 仓库中 WaveTone 音频转写辅助工具 Agent 化封装cli-anything-wavetone的测试体系展开完整解析其测试清单、单元测试计划、端到端E2E测试流程、实际运行结果与覆盖范围说明。读完本文你将掌握该 harness 如何通过 24 项单元测试与 8 项 E2E 测试对项目清单manifest创建、音频探测、会话日志、后端发现、真实wavetone.exe启动冒烟等关键能力进行逐项验证以及如何在本机复现默认测试与真实后端 opt-in 测试。测试全景两层测试文件的职责划分WaveTone harness 的测试体系由两个测试文件组成分别覆盖单元级与进程级两个层面测试文件用例数量覆盖范围test_core.py24 项单元测试项目 manifest 生成、音频探测、会话日志、后端发现test_full_e2e.py8 项 E2E 测试默认真实后端 opt-in 门槛、源码模块子进程解析、CLI 工作流、真实 WaveTone 启动冒烟两个文件同位于 tests 目录共用 helpers.py 中提供的make_wav工具函数来生成真实的 WAV 测试夹具单声道、2 字节采样宽、可配置频率/时长/采样率内部以正弦波采样写入标准 WAV 容器。这套分工使单元测试可完全脱离真实软件运行而 E2E 测试则进一步覆盖 CLI 子进程与真实 GUI 后端的集成路径。单元测试计划从 manifest 到 REPL 的 24 项验证单元测试计划完整覆盖了 core 模块 与 utils 模块 的全部核心能力可按功能域归为以下几组。项目 manifest 的创建与持久化从受支持的 WAV 文件创建 manifesttest_create_project_manifest验证create_project生成的 manifest 携带schema_version: wavetone-project/v1、项目名、音频绝对路径且analysis与 project.py 中定义的DEFAULT_ANALYSIS_SETTINGS完全一致。拒绝缺失文件与不支持扩展名test_rejects_unsupported_audio确认normalize_audio_path对非音频文件抛出ValueError。该函数内置了.wav/.wave/.aif/.aiff/.mp3/.wma/.aac/.ogg/.oga/.flac/.wv/.ape/.alac/.tta共 14 种受支持扩展名白名单。保存/加载 schema 兼容 JSON 的往返一致性test_save_load_project_roundtrip验证先add_label、再set_tempo后保存并重新加载标签与 tempo 元数据完整保留。拒绝非对象 JSONtest_load_project_rejects_non_object_json确认load_project对顶层为数组的 JSON如[]抛出 JSON object 错误且 schema 版本不匹配时同样被拒绝。标签、节奏与分析设置标签按时间排序test_labels_are_sorted以乱序4.0s、1.0s、字符串2.5调用add_label后断言输出顺序为 early → middle → late印证 project.py 中的排序逻辑sort(keytime_seconds)时间戳统一round(..., 6)。设置 tempo 与分析选项test_update_analysis_settings验证update_analysis可修改channel、blocks_per_second与analyze_fundamental_frequency且分析设置遵循仅覆盖传入字段、其余保持默认的合并语义见 update_analysis 实现。CLI 布尔分析标志的三态保持test_cli_analysis_preserves_omitted_boolean_flags是单元测试中极具代表性的一个它先在 manifest 中把analyze_fundamental_frequency与skip_analysis_dialog置为True随后通过CliRunner仅以--channel R调用project analysis子命令断言两个布尔字段在 CLI 输出与重新加载的文件中仍为True。这验证了 wavetone_cli.py 中flag_valueTrue/False, defaultNone的三态设计——Agent 未显式传入的布尔参数不会覆盖已有设置。WFD 分析文件挂载验证test_cli_attach_wfd_requires_existing_wfd_file依次验证三种场景文件不存在时报 does not exist扩展名非.wfd时报错并提示后缀要求合法.wfd文件则被解析为绝对路径写入wfd_path字段。这与 CLI 层 attach-wfd 命令 的前置校验一一对应。JSON 序列化安全性拒绝非有限数值test_rejects_non_finite_project_numbers断言set_tempo(project, float(nan))与update_analysis(reference_frequency_hzfloat(inf))均被拒绝。背后是 project.py 的_finite_float与update_analysis中的有限性检查配合save_project的allow_nanFalse确保写入磁盘的 JSON 永远是可被任何 JSON 解析器消费的合法数据。音频探测三级策略probe_audio采用Python 标准库 → ffprobe → stat 兜底的三级探测策略测试分别锁定每一级test_probe_wav_metadata标准 WAV 由python-wave路径探测probe_method标记为python-wave采样率/声道/时长精确断言。test_probe_malformed_wav_falls_back_to_stat空文件损坏 WAV回退到 stat 元数据时长置为Noneprobe_method为stat。test_ffprobe_uses_single_show_entries_argument通过 monkeypatch 捕获实际构造的 ffprobe 参数断言-show_entries只出现一次且条目字符串为streamcodec_type,codec_name,sample_rate,channels:formatduration,format_name,bit_rate,size这种单参数多条目形式见 audio.py 的 _probe_ffprobe。test_ffprobe_handles_non_numeric_metadataffprobe 返回N/A这类非数值元数据时_safe_float/_safe_int将其安全转换为None文件大小回退到stat().st_size。会话日志的 schema 与载荷校验test_session_event_log验证append_event追加、load_events回读的事件顺序。test_session_rejects_invalid_schema覆盖三种异常——顶层非对象 JSON、events字段非列表、payload 含NaN后者通过 session.py 的_assert_json_safe递归校验并拒绝写入文件保持不存在状态。会话 schema 为独立的wavetone-session/v1。后端发现与 doctor 检查test_find_wavetone_from_env设置WAVETONE_EXE环境变量后find_wavetone()返回该路径的绝对解析结果。后端候选顺序见 wavetone_backend.py 的 default_candidatesWAVETONE_EXE→WAVETONE_HOME\wavetone.exe→WAVETONE_HOME\WaveTone.exe→ 桌面/下载目录的便携路径 → Program Files 标准安装路径。test_doctor_rejects_required_data_directories构造data/目录并把REQUIRED_DATA_FILES中某一项如asdecoder.exe替换成目录断言doctor()的ready为False且对应检查项ok为False。REQUIRED_DATA_FILES共 10 项涵盖bass*.dll解码器族与asdecoder.exe定义位置。启动冒烟与平台门槛test_wavetone_launch_fails_on_early_nonzero_exitmock 后端提前以退出码 42 结束CLI 将退出码透传为进程退出码42且 JSON 中ok: False。test_wavetone_launch_reports_runtime_errors启动抛RuntimeError时CLI 输出干净的错误信息而不含Traceback堆栈。test_launch_requires_windows在 Linux 上调用launch_wavetone抛出 requires Windows对应 wavetone_backend.py 第 106-107 行 的平台检查——WaveTone 是 Windows freeware真实启动只能发生在 Windows 主机。REPL 交互层test_repl_split_strips_windows_quotes验证_split_repl_args用shlex.split(posixFalse)拆分 REPL 输入并剥离成对的双引号同时保留反斜杠路径C:\Users\me\My Music\song.wav不被破坏。test_repl_skin_uses_wavetone_branding_and_local_skill_pathReplSkin横幅包含 WaveTone 品牌名与 Local skill: 本地 SKILL.md 路径提示。test_repl_reports_click_exit_without_unexpected_errorREPL 内wavetone launch触发click.exceptions.Exit(1)时被正确捕获并输出 Command exited with code 1而不是落入 unexpected exception 分支——这正是 wavetone_cli.py 的 REPL 主循环 中按 ClickException → Exit → 兜底 Exception 三层捕获的测试印证。E2E 测试计划CLI 工作流与真实后端冒烟E2E 测试通过真实子进程调用 CLI覆盖两类工作流。CLI 项目工作流模拟 Agent 在打开 WaveTone 之前准备音频文件的完整链路TestCLISubprocess用make_wav生成真实 WAV 夹具源码模块解析默认以python -m cli_anything.wavetone.wavetone_cli解析 CLI——即使 PATH 中存在已安装的cli-anything-wavetone甚至外部设置了CLI_ANYTHING_FORCE_INSTALLED也不会静默切换到已安装版本test_resolve_cli_defaults_to_source_module通过让shutil.which直接pytest.fail来证明默认解析器不触碰 PATH只有force_installedTrue时才走shutil.which路径见test_resolve_cli_uses_installed_only_when_requested执行cli-anything-wavetone --json project new执行project set-tempo --bpm 132.5 --first-bar 0.1执行project add-label intro --time 0.25执行audio probe。验证点CLI 输出为可解析 JSON项目文件真实落盘标签与 tempo 持久化成功音频元数据时长 0.5s、单声道正确。此外test_formats_json断言wavetone formats输出同时包含扩展名列表含.wav与 README 声明的格式名含 MP3。CLI 后端工作流真实后端 opt-in模拟 Agent 校验已安装 WaveTone 后端的过程默认跳过需要显式开启CLI_ANYTHING_WAVETONE_REAL_BACKEND1并设置WAVETONE_EXE或WAVETONE_HOME运行wavetone doctor——验证报告所有捆绑文件含data/asdecoder.exe就绪运行wavetone formats——格式清单包含文档记录的音频扩展名用生成的 WAV 启动真实wavetone.exe短暂等待后由冒烟测试终止进程。验证点doctor 全部检查项通过格式清单完整真实进程成功启动且被--terminate正常回收。其中test_launch_real_backend_with_wav使用--wait 1 --terminate组合断言running_after_wait: true、terminated: true确保验证真实后端可启动的同时不遗留常驻 GUI 进程。opt-in 门槛本身由test_real_backend_requires_explicit_opt_in与模块级_real_backend_ready()守卫实现未设置环境变量、非 Windows 平台、缺少WAVETONE_EXE/WAVETONE_HOME或 doctor 未就绪时整个TestRealWaveToneBackend类以skipif跳过。测试运行方式与实测结果默认测试跳过真实后端仓库测试目录的 TEST.md 记录了在 Windows PowerShell 下的默认运行命令将用户级 Scripts 目录加入PATH、设置CLI_ANYTHING_FORCE_INSTALLED1并清除真实后端相关环境变量后运行 pytest。实测结果为 32 项收集、30 通过 2 跳过耗时 1.44s——两个跳过项正是真实后端冒烟测试collected 32 items ...24 项 test_core.py 单元测试全部 PASSED cli_anything/wavetone/tests/test_full_e2e.py::TestRealWaveToneBackend::test_doctor_real_backend SKIPPED cli_anything/wavetone/tests/test_full_e2e.py::TestRealWaveToneBackend::test_launch_real_backend_with_wav SKIPPED 30 passed, 2 skipped in 1.44s真实后端 opt-in 测试设置CLI_ANYTHING_WAVETONE_REAL_BACKEND1与WAVETONE_HOMEC:\Users\Hp\Desktop\wavetone2.6.1并清除WAVETONE_EXE后重新运行32 项全部通过32 passed in 3.03s真实后端覆盖的启动目标是C:\Users\Hp\Desktop\wavetone2.6.1\wavetone.exe。如果 WaveTone 不在默认便携路径可通过环境变量指定WAVETONE_EXE指向wavetone.exe或WAVETONE_HOME指向解压目录详见 README 安装说明。需要注意的是真实后端测试强制要求 Windows 平台——wavetone.exe无法在 Linux/macOS 上启动。覆盖范围说明与已知缺口已验证的覆盖矩阵据 TEST.md 的 Coverage Notes测试体系共覆盖 20 个能力点可归纳为manifest 域创建、校验、持久化往返、标签排序、tempo/分析设置、CLI 布尔三态保持、WFD 挂载校验、有限数值校验、JSON schema 校验音频探测域WAV 标准库探测、损坏 WAV stat 兜底、ffprobe 单参数构造、非数值元数据容错会话域事件日志追加/回读、schema 与载荷双重校验后端域环境变量发现、数据产物类型校验目录而非文件即失败、启动冒烟失败上报、运行时错误转 CLI 错误、Windows 启动门槛REPL 域Windows 路径拆分、品牌横幅与本地 skill 路径展示、Click Exit 控制流正确上报CLI 子进程域默认解析仓库内源码模块、仅在显式请求时使用已安装入口点。已知限制无头分析与导出仍是空白TEST.md 明确指出一个诚实的边界WaveTone 2.61 没有文档化的无头headless分析与导出 API。分析设置、MIDI/文本导出、WAVE 导出全部走 GUI 菜单流程因此harness 生成的是 Agent 面向的项目 manifestwavetone-project/v1而非 WaveTone 原生 WFD 分析数据——WFD 必须由 WaveTone 本体保存后再通过project attach-wfd挂载回 manifest导出验证目前只能覆盖启动冒烟 音频/项目文件校验真正的分析导出仍待发现稳定的非 GUI 自动化接口后补齐这与 WAVETONE.md 中的 Backend Strategy 完全一致harness 不重新实现 WaveTone 的分析引擎而是以 JSON manifest 作为 Agent 的规划与控制层真实后端始终是wavetone.exe。结语这份测试计划最值得借鉴的地方在于它的诚实分层单元测试用 24 个用例锁死 manifest、探测、会话、后端发现的纯逻辑边界让无 WaveTone 环境的 CI 也能全量跑通E2E 测试用源码模块解析保证测试永远针对当前仓库代码而非误用已安装包真实后端冒烟则通过环境变量显式 opt-in把启动即回收的验证与日常 CI 隔离。对于 Agent 化封装桌面 GUI 软件的实践而言这套测试计划—用例清单—实测结果—覆盖说明—已知缺口的组织方式本身就是一份可复用的质量保障模板。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表