与其他测试运行器的比较
Jest
Jest 凭借其对大多数 JavaScript 项目的开箱即用支持、友好的 API(it
和 expect
)以及涵盖快照、模拟、覆盖率等测试功能的完整包,在测试框架领域占据主导地位。我们感谢 Jest 团队和社区创建了令人愉悦的测试 API,并推动了许多现已成为 Web 生态系统标准的测试模式。
Jest 可以在 Vite 项目中使用。@sodatea 构建了 vite-jest,旨在为 Jest 提供一流的 Vite 集成。Jest 中最后的集成障碍已经解决,因此它是您进行单元测试的有效选择。
然而,在 Vite 已经能够为大多数常见 Web 工具(TypeScript、JSX、最流行的 UI 框架)提供支持的背景下,Jest 可能会引入不必要的复杂性。如果您的应用程序由 Vite 提供支持,那么配置和维护两个不同的构建和测试管道是不必要的。使用 Vitest,您可以将开发、构建和测试环境的配置统一到一个管道中,共享相同的插件和 vite.config.js
配置。
即使您的库没有使用 Vite(例如,如果它使用 esbuild 或 Rollup 构建),Vitest 也是一个值得考虑的选项,因为它能让您的单元测试运行得更快,并且由于默认的监视模式利用了 Vite 即时热模块热重载(HMR),显著提升了开发者体验(DX)。Vitest 提供了与大多数 Jest API 和生态系统库的兼容性,因此在大多数项目中,它应该可以无缝替代 Jest。
Cypress
Cypress 是一个基于浏览器的测试运行器,可作为 Vitest 的补充。如果您想使用 Cypress,我们建议将 Vitest 用于应用程序中的所有无头逻辑测试,而将 Cypress 用于所有基于浏览器的逻辑测试。
Cypress 被称为端到端测试工具,但其新的组件测试运行器对测试 Vite 组件提供了出色的支持,是测试任何在浏览器中渲染内容的理想选择。
像 Cypress、WebdriverIO 和 Web Test Runner 这样的基于浏览器的运行器能够发现 Vitest 无法发现的问题,因为它们使用真实的浏览器和真实的浏览器 API。
Cypress 的测试机制专注于确定元素是否可见、可访问和具有可交互性。Cypress 专为 UI 开发和测试而构建,其开发者体验(DX)的核心在于通过测试来驱动可视化组件的开发。您可以看到组件与测试报告一同渲染。测试完成后,组件仍保持可交互状态,您可以使用浏览器的开发者工具调试发生的任何故障。
相比之下,Vitest 专注于为极速的_无头_测试提供最佳的开发者体验(DX)。像 Vitest 这样的基于 Node 的运行器支持各种部分实现的浏览器环境,例如 jsdom
,这些环境足以让您快速地对任何引用浏览器 API 的代码进行单元测试。缺点是这些浏览器环境在功能实现上存在局限性。例如,jsdom 缺少许多功能,例如 window.navigation
或布局引擎(offsetTop
等)。
最后,与 Web Test Runner 相比,Cypress 测试运行器更像一个 IDE,而非单纯的测试运行器,因为您还可以在浏览器中看到真实的渲染组件,以及其测试结果和日志。
Cypress 也一直在将 Vite 集成到他们的产品中:使用 Vitesse 重建他们的应用程序 UI,并利用 Vite 推动其项目开发。
我们认为 Cypress 并非单元测试无头代码的理想选择,但结合使用 Cypress(用于 E2E 和组件测试)和 Vitest(用于单元测试)将能满足您应用程序的测试需求。
WebdriverIO
WebdriverIO 与 Cypress 类似,是一个基于浏览器的测试运行器,可作为 Vitest 的补充。它既可以作为端到端测试工具使用,也可以用于测试Web 组件。它甚至在底层使用了 Vitest 的组件,例如在组件测试中进行模拟和存根。
WebdriverIO 具有与 Cypress 相同的优势,即允许您在真实浏览器中测试逻辑。然而,它使用实际的Web 标准进行自动化,这克服了在 Cypress 中运行测试时的一些取舍和局限性。此外,它还允许您在移动设备上运行测试,从而在更多环境中测试您的应用程序。
Web Test Runner
@web/test-runner 在无头浏览器中运行测试,提供与您的 Web 应用程序相同的执行环境,无需模拟浏览器 API 或 DOM。这也使得可以在真实浏览器中使用开发者工具进行调试,尽管不像 Cypress 测试那样,没有提供用于逐步执行测试的 UI。
要将 @web/test-runner 与 Vite 项目一起使用,请使用 @remcovaes/web-test-runner-vite-plugin。@web/test-runner 不包含断言或模拟库,因此需要您手动添加。
uvu
uvu 是一个用于 Node.js 和浏览器的测试运行器。它在单个线程中运行测试,因此测试之间缺乏隔离性,可能会跨文件产生副作用。然而,Vitest 使用 worker 线程来隔离测试并并行运行。
在代码转换方面,uvu 依赖于 require 和 loader 钩子。Vitest 使用 Vite,因此文件通过 Vite 强大的插件系统进行转换。在 Vite 已经能够为大多数常见 Web 工具(TypeScript、JSX、最流行的 UI 框架)提供支持的背景下,uvu 可能会引入不必要的复杂性。如果您的应用程序由 Vite 提供支持,那么配置和维护两个不同的构建和测试管道是不必要的。使用 Vitest,您可以将开发、构建和测试环境的配置统一到一个管道中,共享相同的插件和相同的配置。
uvu 不提供智能监视模式来重新运行已更改的测试,而 Vitest 则凭借默认的监视模式(利用 Vite 即时热模块热重载 HMR)提供了卓越的开发者体验(DX)。
uvu 是运行简单测试的快速选择,但对于更复杂的测试和项目,Vitest 能够提供更快、更可靠的体验。