Glances 测试指南:基于变更文件选择测试套件、运行与调试完整实战

发布时间:2026/9/19 23:52:46
Glances 测试指南:基于变更文件选择测试套件、运行与调试完整实战 Glances 测试指南基于变更文件选择测试套件、运行与调试完整实战【免费下载链接】glancesGlances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.项目地址: https://gitcode.com/gh_mirrors/gl/glances本文是一份面向 Glances 开发者的实战测试手册核心内容来自仓库内 .claude/skills/test.md 技能文档它定义了先看 git diff、再按变更文件映射测试套件、最后用 Makefile 目标执行的标准测试流程。读完本文你将掌握 Glances 全部make test-*目标的适用场景、底层实际执行的 pytest 命令、单测与集成测试的运行方式以及测试失败后的分析思路。一、测试策略总览先看变更再选套件Glances 是一个插件化架构的系统监控工具CLI、Web UI、REST API、各类导出器一应俱全因此它的测试也被拆分为多个彼此独立的套件。盲目运行全量测试既慢又难以定位问题正确做法是根据本次代码变更的影响范围只运行对应的测试套件。标准流程来自 .claude/skills/test.md先用git diff --name-only查看已修改的文件包含已暂存 staged 与未暂存 unstaged 的变更。根据变更文件所在目录按下表选择要运行的测试套件。若用户明确指定了测试目标例如运行 core 测试直接使用该目标跳过推断。通过 Makefile 目标执行测试前提是虚拟环境已就绪仓库约定为.venv-uv/。测试失败时分析输出并定位问题。变更文件与测试套件的映射关系变更文件位置应运行的测试说明glances/plugins/make test-plugins或针对性运行pytest tests/test_plugin_name.py插件单元测试可按插件名精准运行glances/outputs/glances_restful_api.py或glances/outputs/glances_mcp.pymake test-restfulREST API 与 MCP 相关glances/outputs/static/make test-webuiWebUI 测试Selenium依赖 Chrome/ChromeDriverglances/exports/make test-exports全部导出集成测试需要 Dockerglances/client.py或glances/server.pymake test-xmlrpcXML-RPC 客户端/服务器通信测试glances/*.py核心文件make test-core核心单元测试不确定或变更范围较大make test运行全量测试从 Makefile 可以看到UNIT_TESTS : test-core test-restful test-xmlrpc这三个目标被定义为常规单元测试集合而test-exports由于涉及真实外部服务数据库、消息队列等单独使用 Docker 环境运行。二、完整的测试命令矩阵.claude/skills/test.md 提供的全部命令如下其中每个make目标在 Makefile 中都有明确对应的底层命令make test # All tests全量测试 make test-core # Core unit tests核心单元测试 make test-plugins # Plugin tests插件测试 make test-api # API unit testsAPI 单元测试 make test-restful # REST API testsREST API 测试 make test-webui # WebUI tests (Selenium)WebUI 测试 make test-xmlrpc # XML-RPC testsXML-RPC 测试 make test-exports # All export integration tests (needs Docker)全部导出集成测试需要 Docker make test-perf # Performance tests性能测试 make test-memoryleak # Memory leak tests内存泄漏测试 # 单个测试文件或指定用例 .venv-uv/bin/uv run pytest tests/test_core.py .venv-uv/bin/uv run pytest tests/test_core.py::TestGlances::test_000_update各目标背后的真实命令结合 Makefile每个目标的底层执行逻辑如下make test→.venv-uv/bin/uv run pytest不带路径参数pytest 会递归收集tests/下所有测试文件属于全量回归。make test-core→.venv-uv/bin/uv run pytest tests/test_core.py只跑核心测试文件。make test-plugins→.venv-uv/bin/uv run pytest tests/test_plugin_*.pyshell 通配符展开后会运行 tests 目录下所有test_plugin_*.py文件例如test_plugin_cpu.py、test_plugin_mem.py、test_plugin_gpu.py、test_plugin_npu.py、test_plugin_smart.py等。make test-api→.venv-uv/bin/uv run pytest tests/test_api.py。make test-restful→.venv-uv/bin/uv run pytest tests/test_restful.py。make test-webui→.venv-uv/bin/uv run pytest tests/test_webui.py。make test-xmlrpc→.venv-uv/bin/uv run pytest tests/test_xmlrpc.py。make test-memoryleak→.venv-uv/bin/uv run pytest tests/test_memoryleak.py。make test-perf→.venv-uv/bin/uv run pytest tests/test_perf.py。make test-exports→ 遍历执行./tests/test_export_*.sh下的全部 shell 脚本包括test_export_csv.sh、test_export_json.sh、test_export_influxdb_v1.sh、test_export_influxdb_v3.sh、test_export_timescaledb.sh、test_export_nats.sh、test_export_clickhouse.sh等。每个脚本会真实启动 Glances 并将数据导出到对应外部服务。此外还有两个有用的变体make test-with-upgrade先升级依赖venv-upgrade再跑全量测试用于依赖变更后的回归验证。单目标导出测试如make test-export-csv只运行./tests/test_export_csv.sh适合只想验证某个导出器时使用。关于运行环境的重要前提所有测试依赖基于uv管理的虚拟环境.venv-uv/Makefile 中统一通过UV_RUN : .venv-uv/bin/uv调用。创建虚拟环境的方式见 Makefilemake install-uv创建环境并安装 uv随后make venv使用uv sync --all-extras --no-group dev安装全部依赖如需开发依赖pytest、selenium 等使用make venv-dev还会安装 pre-commit hooks。若仓库中不存在.venv-uv/需要先按上述步骤初始化否则make test-*会因找不到解释器而失败。三、按模块深入各测试套件在测什么3.1 Core 测试tests/test_core.py核心测试文件 tests/test_core.py 体量最大约 1400 行直接覆盖 Glances 最底层的通用能力例如从glances.globals导入的auto_unit、pretty_date、split_esc、string_value_to_float、subsample等工具函数阈值系统 glances/thresholds.py 中的GlancesThresholdOk/Warning/Careful/Critical与GlancesThresholds过滤机制GlancesFilter/GlancesFilterListglances/filter.py事件列表GlancesEventsList、条形图Bar、插件 DAG 依赖解析get_plugin_dependenciesglances/plugins/plugin/dag.py以及插件模型GlancesPluginModel、ZFS 插件、MPP/NPU 插件等跨平台能力。测试文件顶部还展示了核心测试的初始化模式tests/test_core.pytestargs [glances, -C, ./conf/glances.conf] with patch(sys.argv, testargs): core GlancesMain() test_config core.get_config() test_args core.get_args() stats GlancesStats(configtest_config, argstest_args)它通过 mocksys.argv以-C ./conf/glances.conf启动GlancesMain再构建GlancesStats所有核心测试都围绕这份真实的 stats 实例展开。这解释了为什么运行测试前工作目录必须是仓库根目录——测试依赖./conf/glances.conf相对路径。3.2 共享 Fixturestests/conftest.pytests/conftest.py 为多个套件提供了共享的 pytest fixturesglances_statssession 级同样以-C ./conf/glances.conf初始化GlancesMainGlancesStats供插件类测试复用。glances_stats_no_history在参数中设置time1、cached_time1、disable_historyTrue用于需要关闭历史记录的测试如内存泄漏测试。glances_webserver启动一个真实的 Glances Web 服务器端口 61234带-w --browser并先检查端口是否被占用——如果 61234 已被占用会直接pytest.fail防止测试打到残留的旧 Glances 进程上随后通过轮询http://localhost:61234/api/4/status健康检查端点确认服务就绪。web_browser初始化 headless ChromeSelenium若未安装 selenium 则自动 skip WebUI 测试。3.3 REST API 测试tests/test_restful.pytests/test_restful.py 针对 glances/outputs/glances_restful_api.py 实现测试服务运行在http://localhost:61234/api/{API_VERSION}其中API_VERSION直接取自GlancesRestfulApi.API_VERSION保证测试跟随实现版本第二个服务运行在端口 61235CORS_URL专门用于验证 CORS 凭证防护对应安全通告 GHSA-fp27-88fp-2phg测试会校验 API 返回字段的类型numbers.Number等并覆盖 gzip 压缩响应Accept-encoding: gzip。3.4 WebUI 测试tests/test_webui.pytests/test_webui.py 使用Selenium ChromeDriver做端到端页面测试其前置条件在文件头有明确说明需要安装chromedriverUbuntu 上为sudo apt install chromium-chromedriver且要求 Chrome 与 ChromeDriver 的主版本号一致测试中定义了一组SCREENSHOT_RESOLUTIONS覆盖 PC640×480 到 1920×1200与手机iPhone 8/8 Plus/XS/11 Pro/15/16 Pro Max、Pixel 7等多种分辨率用于响应式布局断言首页测试访问http://localhost:61234配合 conftest 的glances_webserverfixture 使用。注意test-webui需要真实浏览器环境CI 或无头服务器上需确保 chromedriver 可用否则相关用例会被 skip。3.5 内存泄漏测试tests/test_memoryleak.pytests/test_memoryleak.py 用 Python 标准库tracemalloc做内存增长检测先跑 3 轮迭代预热填充内存再对后续 10 轮迭代取快照做snapshot_begin/snapshot_end对比按文件名聚合 diff 后计算每轮迭代的平均内存增长断言必须小于 15000 字节否则判定为内存泄漏并输出泄漏量。该测试需要关闭历史记录使用glances_stats_no_historyfixture说明历史数据保留是 Glances 内存占用的主要来源之一。3.6 导出集成测试tests/test_export_*.sh以 tests/test_export_csv.sh 为例导出类测试是真实端到端验证.venv/bin/python -m glances --export csv --export-csv-file /tmp/glances.csv --stop-after 10 --quiet .venv/bin/python ./tests-data/tools/csvcheck.py -i /tmp/glances.csv -l 9流程为启动 Glances 导出 10 轮数据到/tmp/glances.csv约 20 秒再用 tests-data/tools/csvcheck.py 校验文件至少有 9 行有效数据。InfluxDB、NATS、ClickHouse、TimescaleDB 等脚本逻辑类似但目标换成对应数据库/消息系统因此make test-exports需要 Docker 环境来拉起这些服务。四、按目录精准定位单个插件测试当变更仅涉及某个插件时不必跑全部test_plugin_*。从 tests 目录可以看到每个插件都有独立测试文件CPU、内存、磁盘、网络、GPU、NPU、容器Docker/LXD、虚拟机virsh、WiFi、SMART、传感器等。例如只改动了 NPU 插件直接运行.venv-uv/bin/uv run pytest tests/test_plugin_npu.py只跑某一个用例文档中的示例语法同样适用.venv-uv/bin/uv run pytest tests/test_core.py::TestGlances::test_000_updatepytest 的::定位语法可以精确到类甚至单个测试方法配合-k、-x、--tbshort等参数能极大缩短改代码 → 验证的反馈回路。这与文档第 3 步用户指定目标则直接使用的原则一致先精准后宽泛。五、多版本 Python 兼容性验证tox除 Makefile 之外仓库还通过 tox.ini 提供多版本矩阵测试envlist覆盖py39py313五个 Python 版本每个测试环境安装psutil、orjson、fastapi、uvicorn、jinja2、pytest等核心依赖默认命令为python -m pytest tests/test_core.py即 tox 环境下的核心测试回归。如果你的变更涉及跨版本兼容性例如datetime.UTC这类有版本差异的 API参见 tests/test_core.py 中的兼容处理建议在本地安装 tox 后运行tox验证多个 Python 版本。六、测试失败的排查思路文档第 5 步要求分析输出并建议修复。结合仓库实际情况常见的失败原因与对策如下环境未就绪报错找不到.venv-uv/或缺少 pytest/selenium 等包 → 先执行make venv-dev或make venv 安装 dev 依赖。端口被占用REST/WebUI 测试启动的 Web 服务器端口61234被残留进程占用 → 杀掉旧 Glances 进程后重跑conftest 会主动 fail 并给出提示。WebUI 用例 skip 或失败Chrome 与 ChromeDriver 版本不匹配 → 对齐两者主版本号。插件测试与平台相关部分插件GPU、NPU、传感器、ZFS依赖具体硬件或系统环境在本机不可用时会 skip若需验证请参考 tests-data 中提供的虚拟文件系统数据例如tests-data/plugins/npu/、tests-data/plugins/gpu/。内存泄漏断言失败test_memoryleak报告单轮迭代内存增长 ≥ 15000 字节 → 结合tracemalloc输出的文件名聚合结果定位增长集中在哪个模块。定位到具体模块后再回到第一节的映射表只重跑对应套件形成高效的测试闭环。七、小结Glances 的测试体系遵循按变更范围选择套件的工程实践核心逻辑由tests/test_core.py与共享 fixtures 守护插件按目录独立成测REST/WebUI/XML-RPC 分别验证不同接入层导出器则通过真实外部服务做端到端集成验证tests 目录中 30 个测试文件一一对应。掌握 .claude/skills/test.md 定义的这套工作流——git diff --name-only→ 映射套件 →make test-*→ 分析修复——就能在改动 Glances 时用最小的测试成本获得最大置信度。【免费下载链接】glancesGlances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, macOS and Windows operating systems.项目地址: https://gitcode.com/gh_mirrors/gl/glances创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考