为什么Jest - runInBand会加速测试?

Yan*_*Tay 20 testing jestjs

我读到--runInBand标志在CI服务器上将 Jest测试持续时间加快了50%.我无法在网上找到关于该标志做什么的解释,只是它允许测试在同一个线程中顺序运行.

为什么在同一个线程中运行测试并按顺序使其更快?直觉上,不应该让它变慢吗?

Dar*_*nus 38

阅读您的链接页面和一些其他相关来源(如此github问题),一些用户发现:

... --runInBand资源有限的环境中使用帮助.

... --runInBand我们的测试时间超过1.5小时(实际上我不知道多长时间因为詹金斯在1.5小时内超时)到大约4分钟.(注意:我们的构建服务器资源非常糟糕)

我们可以看到,这些用户在他们的机器上的性能有所改善,即使他们的资源有限.如果我们--runInBand文档中读取标志所做的内容,它会说:

别名:-i.在当前进程中以串行方式运行所有测试,而不是创建运行测试的子进程的工作池.这对调试很有用.

因此,考虑到这些评论和文档,我认为性能的提高是由于现在该过程在单个线程中运行.这极大地帮助了有限资源的计算机,因为它不必花费内存和时间来处理和处理线程池中的多个线程,这个任务可能因其有限的资源而过于昂贵.

但是,我相信只有当您使用的机器资源有限时才会出现这种情况.如果你使用一个更"强大"的机器(即:几个核心,体面的RAM,SSD等)使用多个线程可能会比运行一个更好.

  • 请注意,虽然 `--runInBand` 也可能会减慢运行速度,例如。如果您有很多测试套件,最好使用“--maxWorkers”或“--maxParallel”并将其设置为核心/线程数。在我们的 Jenkins CI(4 核,8Gb)中,我们使用“--runInBand”进行了 50 分钟的单元测试,在将其设置为“--maxParallel=4”后,测试时间减少到 20 分钟。如果没有任何这些设置,它就会因内存不足(OOM)而死亡,因为它会产生许多线程(这两种方法都会阻止)。 (6认同)
  • 多么糟糕的命名选项。--singleThread 可能更清楚。即使在 8 核 i9、32Gb MacBookPro 上,此选项也始终将测试套件时间从 30 秒缩短至 23 秒。 (6认同)
  • 我使用的是 i5-3570 @ 3.40GHz,配备 16 GB RAM + SSD,并且使用 ```--runInBand``` 看到了显着的性能改进 - 这不是最先进的计算机,但我不确定我将其称为有限资源计算机。对我来说,为什么 runInBand 更快没有任何意义。 (5认同)

小智 8

在多线程中运行测试时,请为每个线程创建一个缓存。使用--runInBandjest 运行时,请为所有测试使用一个缓存存储。

我运行20个相同的测试文件后发现它,首先使用key --runInBand,第一个测试花费25秒,下一个相同的测试每个花费2-3s。

当我运行无--runInBand键测试时,每个相同的测试文件将在25秒内执行。