放弃 Jest 后,运行时间减少 90%!

开发 前端
Jest 是个众所周知的、功能完备的测试框架,曾经在选择时并没有经过深思熟虑。然而,经过数百次测试后,情况开始变得很糟糕。内存泄漏开始浮出水面,临时的标志位数量增多,经常访问 Jest 的 issues 标签页已经成为家常便饭。

这是一个关于 Jest 在 JS 服务端的经验分享,注意,不是 UI 测试。如果你对 Jest 感到满意,请不要切换!这不是为了说服任何人。

Jest 是个众所周知的、功能完备的测试框架,曾经在选择时并没有经过深思熟虑。然而,经过数百次测试后,情况开始变得很糟糕。内存泄漏开始浮出水面,临时的标志位数量增多,经常访问 Jest 的 issues 标签页已经成为家常便饭。

问题

以下是作者曾在 Jest 中遇到的一些问题,通过这些标志可以帮助排插问题或提高部分的性能,如果你在使用 Jest,可以做为一个参考。

  • jest —logHeapUsage:监视堆使内存用情况,以发现突然增长的内存泄漏。
  • jest —maxWorkers=50%:一些基准测试显示,该配置可使测试运行速度提高 20%,也有些人说这会变得更糟。
  • jest —runInBand: 这在当前进程中串行运行所有测试,而不是创建一个子进程的工作池。有人说这对于调试很有用,但奇怪的是,一些人报告说它实际上可以提高性能。
  • jest —changedSince:该标志可以显著减少 PR 工作流程所需的时间。
  • jest-slow-test-reporter:这个报告器可以发现你项目中最慢的测试。
  • --expose-gc:暴露 Node.js 的垃圾收集器。某些情况下,使用 --expose-gc 标志运行 Node 似乎能更好地处理内存泄漏。

不够好

这些策略中的一些在这段时间内显著减少了运行时间。然而,学习和实施它们的过程是以交付时间为代价的,而这实际上更为关键。

测试是如此缓慢,以至于我只在我们当前正在开发的模块上运行它们,然后只在PR中更改的模块上运行它们,最后,所有的测试只有在合并到主分支时才会运行。不幸的是,这种方法导致了识别错误的延迟。

测试如此耗时,以至于我发现自己在为某些功能犹豫是否编写测试,担心它们会导致额外的构建过程时间。在这一点上,我意识到是时候转变了

切换到 Mocha

我十年前用过 Mocha,感觉非常棒。所以,我以为回到 Mocha 会很顺利。在过去的几年里,我看到人们一直在抛弃从 Jest 到 Mocha 的想法,而我总是觉得很有趣。我记得有很多指南和人们在谈论从 Mocha 迁移到 Jest。像我一样,大多数人会认为更新的工具会有更好或者至少类似的性能。

迁移比预期的要容易得多。几个替换案例,少于一个小时的重构一些代码。比较困难的部分是模拟引擎,这在 Mocha 中没有包含。

我本来可以使用 Sinon.js 来做到这一点,但我真的很喜欢有一天不依赖任何测试库的想法。我甚至考虑过只使用新的 Node.js 内置测试运行器,但对我来说它还不够完善。所以,我决定只使用内置的 MockTracker。

尝试后让人惊讶。使用 Jest 运行需要3秒的单个测试,在 Mocha 中只需要不到 200ms。这应该不足为奇——我运行的测试不应该花费那么长时间,但我已经习惯了那种缓慢。最终,我们的测试运行时间从超过 12 分钟缩短到不到 40 秒。

Mocha 的速度帮助我们发现了隐藏的错误,这些错误偶尔会导致测试失败,因为它们只在非常特殊的条件下发生——这些条件在 Jest 中由于其较慢

结论

我仍然在我维护的一些较小的代码库中使用 Jest,并且除非它们成为问题,否则我不会疯狂地迁移它们。然而,对于未来的项目,我肯定会选择 Mocha 或 Node.js 测试运行器。

问题在于,即使有一种方法可以优化 Jest 并在合理的时间内运行数千个测试,但仅仅切换测试框架就能显著提高性能,这是有问题的。你同意吗?你有类似的经历吗?我很乐意听听。

作者 | Patrickrbc翻译、整理 | 五月君原文 https://patrickrbc.com/2024/03/16/jest-slow-tests

责任编辑:武晓燕 来源: 编程界
相关推荐

2021-08-18 08:32:09

代码运行时间示波器

2015-07-20 15:44:46

Swift框架MJExtension反射

2020-04-06 11:47:44

Linux命令脚本

2010-01-27 14:14:48

C++程序运行时间

2024-03-21 09:15:58

JS运行的JavaScrip

2021-09-11 15:38:23

容器运行镜像开放

2019-07-12 09:30:12

DashboardDockerDNS

2019-10-14 09:14:37

Linuxbash命令

2021-06-24 10:28:19

uptimed命令Linux

2022-11-04 09:09:54

Linux服务器

2020-12-07 13:31:43

GoMutex开发者

2024-03-20 10:46:00

云原生容器

2013-11-26 16:49:55

Android开发运行时KitKat

2023-01-03 09:10:21

2023-07-28 10:42:43

2022-01-19 08:50:53

设备树Linux文件系统

2021-08-27 00:21:19

JSJust源码

2023-02-12 12:00:57

2023-08-29 08:20:35

Kubernete跨云容器

2022-12-30 08:08:30

点赞
收藏

51CTO技术栈公众号