Jest.js 为什么`npm测试`只需要一个测试就需要这么长时间?

7ajki6be  于 2023-10-14  发布在  Jest
关注(0)|答案(2)|浏览(138)

npx create-react-app my-app之后,我运行npm test,得到以下结果:

PASS  src/App.test.js
  ✓ renders learn react link (48ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.555s
Ran all test suites.

Watch Usage: Press w to show more.

为什么运行整个套件需要2.5s,而运行测试只需要48ms?如何加快这一进程?谢谢你,谢谢

更新:我正在运行此计算机:

krcsximq

krcsximq1#

答案很简单:如果你的测试用了48毫秒,而整个套件的持续时间用了2.555秒,那么还有其他正在运行的代码占用了另外的2.507秒。
换句话说,在这一次测试之前和之后必须运行的代码比您在不查看jest库的框架代码的情况下看到的要多得多。
这就是为什么套件的运行时间(2.5秒)比测试的总和(48毫秒)长。
为了使测试更简单(也更容易)和更自动化,有很多“幕后”代码允许您:

  • 按照您的方式编写测试,即。以一种易于理解/编写的方式,但不一定是编译器实际上如何看待它;它将被编译成其他东西
  • 找到每个测试所需的文件;将所有指定的文件放在一起需要一些时间
  • 编译指定的文件(例如,使用webpack)到你在构建中指定的内容,
  • 构建/编译一个测试环境来运行您的代码,因为jest模拟浏览器来保持您的代码与在生产环境中运行的代码相似
  • 运行测试
  • 然后输出结果

一个类比是租一辆共享汽车;你有一个最低的成本,只是进入汽车,但一旦你在那里,它是加上每分钟或每英里的成本。所以,租一辆自行车要花2.507美元,每英里再加4.8美分。
一旦你的测试环境在一开始就建立好了,你的后续测试就不会每次都需要2.5秒的时间来运行。
与时间有关的笑话的有用链接:

加快测试速度的方法是:

  • 请确保您的webpack/babel已正确配置为jest,
  • 您可以以一种智能的方式使用setup-teardown,
  • (可选/可选)您可以在node rather than jest's default jsdom environment中运行测试。虽然缺点是你的React测试会失败,所以这只适用于纯Node测试(服务器端)。
  • 讨论如何编写高效的测试,因为优化的测试代码会产生不同,这里有一篇这样的文章,provides some insight

另一个非代码选项是使用更好/更快的CPU或使用更高效的操作系统。
你的2.555秒与默认的React应用程序是众多的速度比我的6.17秒在Windows 10上,华硕GL 502 VMK。
在Ubuntu 20桌面虚拟机上运行它(上面提到的同一台Windows 10机器上的Virtualbox,12 GB主机RAM中的8个,8个主机CPU中的4个),它需要2.105秒。
你可以找到很多抱怨Jest和执行时间的文章,所以看起来不一定只有你这样做。Jest的某些部分并不快。

bbmckpt7

bbmckpt72#

我能够添加--maxWorkers=4标志,并看到速度增加
没有国旗

PASS  src/organization/organization.service.spec.ts (6.039 s)
 PASS  src/test/test.controller.spec.ts (6.318 s)
 PASS  src/test-suite/test-suite.controller.spec.ts (6.33 s)
 PASS  src/organization/organization.controller.spec.ts (6.593 s)
 PASS  src/test-suite/test-suite.service.spec.ts

Test Suites: 3 skipped, 5 passed, 5 of 8 total
Tests:       7 skipped, 23 passed, 30 total
Snapshots:   0 total
Time:        11.128 s

添加了--maxWorkers=4

PASS  src/test/test.controller.spec.ts (5.364 s)
 PASS  src/organization/organization.controller.spec.ts (5.446 s)
 PASS  src/organization/organization.service.spec.ts
 PASS  src/test-suite/test-suite.controller.spec.ts
 PASS  src/test-suite/test-suite.service.spec.ts

Test Suites: 3 skipped, 5 passed, 5 of 8 total
Tests:       7 skipped, 23 passed, 30 total
Snapshots:   0 total
Time:        9.139 s

尽管随着测试的进行,它似乎变化很大。花这么长时间还是很疯狂我习惯于在Angular项目中使用Jasmine/Karma测试,这些测试运行得非常快。我可以在Jest设置expect(true).toEqual(true)所需的时间内运行几百个测试

相关问题