本文档介绍了 Node.js 项目用于自我测试的内部测试系统。它涵盖了测试组织、执行模式、测试类别以及特定于平台的配置。有关 Node.js 应用程序开发者可用的 Node.js 测试运行器 API 的信息,请参阅测试运行器。
Node.js 内部测试系统旨在确保跨多个平台、体系结构和配置的可靠性。它根据执行模式和资源需求将测试组织成不同的类别,并提供处理特定于平台测试行为的机制。
来源
Node.js 测试被组织成几个不同的类别,每个类别都有不同的执行模式和资源需求。
| 类别 | 描述 | 执行模式 | 资源使用 |
|---|---|---|---|
| 并行 | 可以并发运行的小型单元测试 | 并发 | 低 |
| 顺序 | 必须按顺序运行的测试 | 串口 | 中等 |
| Pummel | 对系统施加重负荷的压力测试 | 串口 | 高 |
| Async-hooks | async_hooks API 的测试 | 混合 | 可变 |
| Node-API | Node-API (N-API) 的测试 | 混合 | 可变 |
| Report | 诊断报告功能的测试 | 混合 | 可变 |
| Abort | 中止行为和信号处理的测试 | 混合 | 可变 |
每个测试类别在 test/ 文件夹中都有自己的目录,并且可能包含一个 .status 文件,该文件指定了特定于平台的行为。
来源
下图说明了 Node.js 测试系统的整体架构。
来源
状态文件是测试系统的关键组成部分,允许测试在不同的平台和配置下表现出不同的行为。每个测试类别都可以有一个 .status 文件,该文件定义了特定于条件的行为。
状态文件遵循一致的格式。
prefix <category>
# Comment lines start with #
[<condition>] # This section applies when condition is true
test-name: PASS,FLAKY
another-test: SKIP
条件可以包括:
true - 适用于所有平台$system==win32 - 仅限 Windows$system==linux - 仅限 Linux$system==macos - 仅限 macOS$arch==arm || $arch==arm64 - ARM 架构$system==solaris - Solaris/SmartOS$system==freebsd - FreeBSD$system==aix - AIX$system==ibmi - IBM i$asan==on - 已启用 AddressSanitizer测试行为可以指定为:
PASS - 测试应通过SKIP - 测试应被跳过FLAKY - 测试有时可能会失败(通常与 PASS 配对)来源
Node.js 的测试系统处理各种特定于平台的挑战。
| 平台 | 常见问题 | 解决方案 |
|---|---|---|
| Windows | 文件系统,路径分隔符 | 特定于平台的测试标志 |
| Linux | 性能变化 | 宽松的时间断言 |
| macOS | 网络超时 | 将测试标记为 flaky |
| ARM/ARM64 | 性能、加密差异 | 跳过加密测试,放宽时间限制 |
| Solaris/SmartOS | 域和错误处理 | 将域测试标记为 flaky |
| IBM i | 网络和套接字相关 | 跳过受影响的测试 |
来源
Node.js 测试通常遵循此结构:
导入所需模块
使用 common 模块进行测试工具
使用 Node.js 内置的 assert 模块编写断言
对于较新的测试,请使用 Node.js 测试运行器 API。
来源
对于性能钩子、工作线程或文件系统操作等复杂功能,测试通常使用:
来源
Node.js 测试运行器通过以下步骤执行测试:
对于特殊测试类型(如 Node-API 或 C++ 测试),在执行测试之前可能需要额外的构建步骤。
来源
测试系统对常见类型的测试失败有特殊处理。
PASS,FLAKY。通常需要特殊处理的问题示例:
来源
测试系统与 GitHub Actions 集成,以在多个平台、Node.js 版本和配置上运行测试。CI 系统运行:
当对 Node.js 提出更改建议时,CI 系统会自动运行测试套件,以验证兼容性并防止回归。
Node.js 测试中常用几个模块:
| 模块 | 目的 |
|---|---|
common | 共享的测试工具和助手。 |
assert | 标准断言。 |
tmpdir | 临时目录管理。 |
countdown | 跟踪多个异步操作的完成情况。 |
node:test | 测试运行器 API(较新的测试)。 |
来源
为 Node.js 内部编写测试时,请遵循以下最佳实践:
Node.js 内部测试系统为跨不同平台、配置和环境的测试提供了一个强大的框架。其按不同测试类别组织的结构,结合特定于平台的.status 文件,可以精确控制测试执行。
刷新此 Wiki
最后索引时间2025年4月17日(e61937)