关于测试

这份报告是 Vitest 测试运行器结合 Istanbul 生成的代码覆盖率报告。以下是各部分的详细解释:
顶部摘要 (Summary)
| 指标 | 说明 | 当前值 |
|---|---|---|
| Statements | 可执行语句覆盖率 | 6.61% (89/1210) |
| Branches | 条件分支覆盖率(如 if/else) | 66.66% (24/26) |
| Functions | 函数/方法调用覆盖率 | 50% (13/24) |
| Lines | 代码行覆盖率 | 6.61% (169/1210) |
测试状态概览
- FALL (0):失败测试数(0 表示全部通过)
- RUNNING (0):运行中测试数(0 表示无测试进行中)
- PASS (1):通过测试数(1 个测试通过)
- SKIP (--):跳过测试数(
--表示未统计或无数值)
在代码覆盖率报告(如Istanbul/nyc生成的报告)中,1x 表示该行代码在测试过程中被成功执行了1次。这是覆盖率工具对代码执行频率的可视化标记系统,具体含义如下:
不同标记的含义
| 标记 | 含义 | 视觉表现 |
|---|---|---|
| 1x | 代码被执行了1次 | 通常显示为绿色背景 |
| 2x, 3x | 代码被执行了多次 | 数字越大颜色越深绿 |
| 0x | 代码从未被执行 | 显示为红色背景 |
| I | 忽略的代码(如注释) | 灰色或无背景色 |
| E | 执行出错的代码 | 黄色或橙色背景 |
为什么关注"1x"
- 最低通过标准:1x表示代码至少被测试覆盖一次
- 质量指标:
- 关键代码应有更高执行次数(如3x+)
- 1x可能暗示边缘case覆盖不足
- 风险识别:
- 所有1x代码需验证是否包含分支逻辑
- 高频方法(3x+)应检查性能影响
💡 最佳实践:核心业务逻辑的目标执行次数应≥3x,而工具类方法保持1x即可接受。
jsdom 和 happy-dom
jsdom 和 happy-dom 都是用于在 Node.js 环境中模拟浏览器 DOM 的 JavaScript 库,但它们的设计目标、性能表现和功能支持有所不同。以下是两者的核心区别:
1. 设计目标与主要用途
| 特性 | jsdom | happy-dom |
|---|---|---|
| 主要用途 | 通用 DOM 模拟,兼容传统 Web 标准 | 专注于 Web Components 和 SSR(服务器端渲染) |
| 性能优化 | 较慢(尤其在 23.2.0 版本后性能下降) | 更快,专为高效 DOM 操作优化 |
| 适用场景 | 测试、爬虫、传统 DOM 操作 | 现代前端框架(如 Lit、Stencil)、SSR、测试 |
关键差异:
jsdom更通用,但性能较差,尤其是在复杂选择器操作时。happy-dom针对 Web Components 和 SSR 优化,执行速度更快。
2. 性能对比
| 操作 | jsdom (ms) | happy-dom (ms) |
|---|---|---|
| HTML 解析 | 256 | 26 |
| 序列化 HTML | 65 | 8 |
| 渲染自定义元素 | 214 | 19 |
querySelectorAll | 4.9–10.4 | 0.7–3.8 |
结论:
happy-dom在 DOM 操作和解析方面比jsdom快 5–10 倍。jsdom23.2.0 版本因更换选择器引擎导致性能显著下降(如querySelector慢 800 倍)。
3. 功能支持
| 功能 | jsdom | happy-dom |
|---|---|---|
| Shadow DOM | ✅ | ✅(更优支持) |
| MutationObserver | ✅ | ✅ |
| Fetch API | ✅ | ✅ |
| CSSOM 支持 | ✅ | ✅(部分优化) |
<details> 元素 | ✅(标准) | ✅(旧版有差异,已修复) |
| 文件加载控制 | ❌(默认加载) | ✅(可禁用 JS/CSS 加载) |
关键差异:
happy-dom允许禁用文件加载(disableJavaScriptFileLoading),适合单元测试。jsdom对传统 Web API 支持更完整,但happy-dom更适合现代 Web Components 开发。
4. 兼容性与 SEO 优化
| 方面 | jsdom | happy-dom |
|---|---|---|
| SSR 优化 | ❌ | ✅(专为 SSR 设计) |
| SEO 友好 | ❌ | ✅(预渲染支持更好) |
| TypeScript 支持 | ✅ | ✅(v18+ 类型更严格) |
结论:
- 如果项目需要 服务器端渲染(SSR) 或 SEO 优化,
happy-dom是更好的选择。 jsdom适合需要 完整浏览器模拟 但不太关注性能的场景。
5. 临时解决方案与版本问题
jsdom性能问题:- 23.2.0 版本因选择器引擎变更导致性能下降,可回退到 23.1.0 或使用优化版
dom-selector。
- 23.2.0 版本因选择器引擎变更导致性能下降,可回退到 23.1.0 或使用优化版
happy-dom行为差异:- 旧版对
<details>元素的open属性处理与浏览器不一致,但最新版本已修复。
- 旧版对
总结:如何选择?
- 选
happy-dom如果:- 需要 高性能 DOM 操作(如测试、SSR)。
- 项目基于 Web Components 或需要 Shadow DOM 支持。
- 希望 禁用文件加载 以加速单元测试。
- 选
jsdom如果:- 需要 最接近真实浏览器的行为(如爬虫、复杂 DOM 测试)。
- 依赖 旧版 Web API 或无法升级到
happy-dom。
最新趋势:越来越多的现代框架(如 Vitest)开始默认使用
happy-dom替代jsdom,因其更快的速度和更低的资源占用。