周三下午三点,一个前端开发者发了条推文:Preact的整个测试套件跑完只要大约1秒。1003个测试用例,在浏览器里跑,直接对着真实DOM断言。这条推文炸出了无数开发者——因为当下主流前端测试工具,跑同样的量级,时间得翻几十倍。很多年轻前端甚至从没见过跑得这么快的测试套件。一个问题自然而然地浮现了:它到底是怎么做到的?
先回到最笨的方法,看看理论上能有多快。丢开所有测试框架,直接在浏览器控制台里写一段最简化的测试:创建一个DOM容器,渲染一个组件,检查结果HTML对不对。把这段代码套进循环,跑10万次。在我的 M1 MacBook Air 上,耗时约182毫秒。算下来,单次测试的消耗几乎为零。记住这个数,它就是我们能参考的速度基线。此后加到测试流程上的每一层东西,都只是额外开销。
接着把老古董请出来。往页面里插几个脚本标签,把 Mocha 加进来,刷新浏览器再跑一次,数字变成了约210毫秒。多出来的35毫秒,就是 Mocha 带来的额外消耗。要知道,Mocha 2011年就发布了,Jasmine 更早,2008年就有了,它们的速度放到今天依然很快。这就引出下一个问题:为什么老测试框架能这么快?
差异藏在“隔离”这两个字里。现代测试运行器默认会给每个测试用例做大量隔离——独立的作用域、全新的模块缓存、重置模拟环境,确保测试之间互不干扰。这套工序安全是安全,但成本巨大,每启动一个测试用例就得重新初始化大量东西。而老一代框架选择的是另一种策略:默认不做过多隔离,只在你需要的时候打开需要的隔离层级。什么时候需要单独的沙箱?什么时候复用运行环境更划算?把选择权交还给开发者,测试跑起来自然就轻快了。Preact 的实践就是这种思路的注脚:大多数代码根本用不着现代测试框架默认给的那种强隔离,只要你有办法按需控制隔离程度,把1000个测试跑进1秒,真不算什么难事。
热门跟贴