ARTICLE DETAIL

资讯详情

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

uutils GNU 测试套件覆盖率追踪机制:从每日自动更新到源码级实现

uutils GNU 测试套件覆盖率追踪机制:从每日自动更新到源码级实现 uutils GNU 测试套件覆盖率追踪机制从每日自动更新到源码级实现【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils本文围绕 uutils coreutils 仓库中的 GNU Test Coverage 页面 展开系统讲解这套用 GNU coreutils 官方测试套件检验 Rust 重写实现的覆盖与追踪体系。你将了解覆盖率页面如何按类别呈现 PASS/SKIP/FAIL/ERROR 结果、每日自动更新的数据流水线如何运作以及如何在本地复现run-gnu-test.sh的完整跑测流程、理解不可修复测试清单背后的底层原因。读完即可上手本地跑测并读懂上游追踪数据的含义。为什么用 GNU 官方测试套件来测 Rust 重写uutils 是一个用 Rust 重写 GNU coreutils 的开源项目其正确性的最高验收标准是与 GNU 原版在可观察行为上保持一致。为此项目直接引入 GNU coreutils 自带的测试套件作为对照基准test_coverage.md开篇即说明 uutils is actively tested against the GNU coreutils test suite且测试结果每天自动更新。这意味着覆盖率页面上的每一个数字都不是静态声明而是当天真实跑完 GNU 测试套件后的结果聚合。整个体系由三部分构成跑测层util/run-gnu-test.sh 驱动 GNU 的make check测试框架让被测对象指向 uutils 编译产物解析与聚合层util/gnu-json-result.py 把测试日志提炼为 JSONutil/analyze-gnu-results.py 按优先级聚合统计展示层docs/src/test_coverage.md 页面配合 test_coverage.js 与 test_coverage.css 渲染结果。覆盖率页面按类别展开与四色语义页面主体是Coverage per category按类别覆盖率区块其交互与配色规则为点击类别可展开查看具体测试名——每个类别是一个可折叠的details元素绿色表示通过PASS黄色表示跳过SKIP红色表示失败或错误FAIL / ERROR。颜色定义在 docs/src/test_coverage.css 的 CSS 变量中:root { --PASS: #44AF69; --ERROR: #F8333C; --FAIL: #F8333C; --SKIP: #d3c994; }对应的 DOM 渲染逻辑在 docs/src/test_coverage.js 中parse_result()递归遍历结果 JSON——字符串值直接输出为一行结果span classresultPASS/span category对象值则递归创建details/summary折叠结构progressBar()计算 PASS / SKIP / FAIL 三类占比用 CSSlinear-gradient绘制进度条并把PASS / SKIP / FAILERROR的数量展示在进度条左侧。页面底部的 Progress over time随时间进展区块展示的是通过率随日期的演变曲线由追踪仓库生成的图表提供与上方每日自动更新的机制相互印证。数据从哪里来日志 → JSON → 聚合 的三级流水线第一步把 GNU 测试日志提取成 JSONutil/gnu-json-result.py 遍历测试执行目录下所有**/*.log文件按目录层级构建嵌套 JSON再用正则从日志末行提取结果状态(PASS|FAIL|SKIP|ERROR) [^ ] \(exit status: \d\)$即每条日志的收尾格式是PASS test-name.sh (exit status: 0)这类行脚本据此把每个测试映射到其类别目录下。第二步多文件聚合与优先级裁决util/analyze-gnu-results.py 负责把多份 JSON 结果例如不同平台/不同构建配置各自跑出的结果合并成一份其聚合优先级从高到低为PASS最高优先级最好的结果FAILERRORSKIP最低优先级脚本同时统计TOTAL / PASS / SKIP / FAIL / XPASS / ERROR六项指标最终输出可直接被 shelleval的 export 语句供 CI 工作流读取。XPASS意外通过与ERROR字段在 JSON 数据中不存在时按 0 计入仅用于兼容统计口径。第三步页面加载聚合结果test_coverage.js 在页面加载时 fetch 聚合后的aggregated-result.json交给parse_result()渲染。整个链路即跑测 → 日志 → JSON → 聚合 → 页面。本地复现把 uutils 放进 GNU 测试框架如果希望在本地亲手跑一遍这套覆盖测试DEVELOPMENT.md的 Comparing with GNU 章节给出了标准流程bash util/build-gnu.sh # 用 release 优化构建 uutils 后再跑 env PROFILErelease bash util/build-gnu.sh # 启用 SELinux 相关工具后跑 env SELINUX_ENABLED1 bash util/build-gnu.sh bash util/run-gnu-test.sh首次执行util/build-gnu.sh时脚本会提示如何按对应 release 标签检出 GNU coreutils 源码树完成后重新运行该命令即可。跑测还依赖补丁管理工具 quilt用于把 util/gnu-patches/ 下的补丁应用到 GNU 测试代码上。FreeBSD 用户需额外安装coreutils与gsed两个包。跑指定测试与调试模式util/run-gnu-test.sh支持传入测试路径只跑你关心的用例# 跑单个测试 bash util/run-gnu-test.sh tests/touch/not-owner.sh # 跑多个测试 bash util/run-gnu-test.sh tests/touch/not-owner.sh tests/rm/no-give-up.sh # perl 测试用 debug 构建调试 DEBUG1 bash util/run-gnu-test.sh tests/misc/sm3sum.pl从脚本源码看其内部还会校验测试文件是否存在支持.sh/.pl/ 无扩展名三种形态并通过make check TESTS... SUBDIRS. RUN_EXPENSIVE_TESTSyes RUN_VERY_EXPENSIVE_TESTSyes的方式把任务交给 GNU 测试框架同时设置gl_public_submodule_commit以兼容浅克隆的 gnulib并用 4 小时超时兜底偶发卡死的进程。自愈机制把 GNU 测试框架指向当前构建util/run-gnu-test.sh 中有一段关键的自愈逻辑GNU 测试目录可能在多个 uutils checkout 之间共享为避免框架静默运行到旧的构建产物上脚本会按PROFILE默认优先debug/release/release-small或探测target/*/coreutils定位当前 multicall 二进制用coreutils --list枚举所有工具名为每个名字建立指向该二进制ln -f的硬链接GNU 测试调用install时则补一个ginstall链接用 sed 把Makefile/tests/local.mk中的PATH改写为当前构建目录并 touchMakefile.in/Makefile防止 make 误触发 automake 重生成。这套机制让只重跑测试、不重建整个项目成为可能——只要构建产物还在脚本会自行把框架指向它。特殊测试的分流TTY、root/SELinux 与 QEMU 沙箱普通测试之外run-gnu-test.sh还为两类特殊用例做了分流run-tty 模式bash util/run-gnu-test.sh run-tty会 grep 出所有require_controlling_input_terminal的测试逐个单独运行通过script -qec分配伪终端避免某个 TTY 测试失败破坏其他测试的执行环境run-root 模式bash util/run-gnu-test.sh run-root ...在 CI 环境下以sudo make check-root方式运行需要 root 权限的用例例如 SELinux 相关测试日志单独写入tests/test-suite-root.log。此外util/run-gnu-tests-smack-ci.sh 提供了一条更重的路径在 QEMU 中启动带SMACK 安全模块的内核构建 initramfs 根文件系统busybox 动态库 GNU tests把 uutils 各工具以硬链接形式铺进/bin逐条运行需要require_smack_或 rootfs 挂载条件的测试。其判定规则为EXIT:0→ PASS、EXIT:77→ SKIPGNU 测试约定、其余 → FAIL并同样生成可供gnu-json-result.py解析的.log文件。诚实的数据口径gnu-unfixable-tests.txt 与补丁机制覆盖率数字并非无脑全算。仓库用 util/gnu-unfixable-tests.txt 维护一份从统计中剔除的清单并明确给出两类剔除理由结构性不可能Structurally impossible这些测试在 GNU 自己的 C 源码里设 gdb 断点如src/remove.c的^excise、src/tail.c的^tail_forever_inotify或要求test $(uname) GNU这类仅对 GNU 系统生效的条件Rust 实现无论如何改写都无法让它们通过代表如rm/r-root.log、tail/inotify-race.log、id/gnu-zero-uids.log需要匹配 GNU 的 libc 入口点测试用LD_PRELOAD覆盖某个符号并监听其是否被调用而 Rust 标准库走的是另一套系统调用如statx、readdir64要让拦截生效就得放弃更合理的实现路径。代表如cp/nfs-removal-race.log覆盖__xstat/stat、df/skip-duplicates.log要求getmntent/mtab、rm/rm-readdir-fail.log覆盖readdir。该文件强调只是困难、未实现或偶发的测试不会进入这份清单它们会继续留在统计里以此保证数字反映的是我们真正能影响的测试。清单由追踪仓库消费口径与页面统计一致。同时util/gnu-patches/ 下维护了一批对 GNU 测试代码的补丁series文件管理应用顺序用于修正上游测试在 uutils 环境下的适配问题例如tests_ls_no_cap.patch、tests_cut_error_msg.patch、tests_numfmt.patch、tests_pwd-long.patch、error_msg_uniq.diff等——这解释了为何文档注释要求安装 quilt。定向排查剩余失败remaining-gnu-error.py当聚合结果出炉后util/remaining-gnu-error.py 可以从失败清单反向定位待修复用例它下载/复用聚合 JSON对照../gnu/tests/下的.sh/.pl/.xpl脚本把 PASS 与 SKIP 从候选集中剔除最终按测试脚本体积从大到小排序输出 FAIL 与 ERROR 列表并对包含require_root_的用例额外标注方便开发按性价比安排修复优先级体积越大的测试通常覆盖行为越多。仓库还提供了配套对比脚本如 util/compare_gnu_result.py、util/compare_test_results.py用于横向比对不同版本或不同配置的 GNU 测试结果进一步支撑覆盖率数据的解读。小结一套以 GNU 为镜的持续验证闭环从 docs/src/test_coverage.md 这一页出发可以完整看到 uutils 的质量验证闭环每天由 CI 跑 GNU 官方测试套件 → 日志提取为 JSON → 按优先级聚合 → 渲染成可交互的覆盖率页面。页面上的绿/黄/红三色背后是 util/run-gnu-test.sh 的构建定位与自愈、util/gnu-json-result.py 的日志解析、util/analyze-gnu-results.py 的优先级聚合以及对结构性不可修复用例的诚实剔除util/gnu-unfixable-tests.txt。对开发者而言这套体系的价值在于既可以用bash util/run-gnu-test.sh tests/util/case.sh快速回归单个行为也能借助按类别可展开的页面把握每个工具的整体对齐进度——而这一切都建立在与 GNU 官方测试逐字节对齐的严格口径之上。【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表