Angular的DestroyAfterEach选项是否会影响Jest测试的运行速度?
Angular
DestroyAfterEach 配置后Jest测试无提速问题解答 无提速属于预期情况的核心原因
DestroyAfterEach是Angular 12.1版本新增的测试优化选项,设计初衷是解决Karma搭配真实浏览器测试时的性能痛点:真实浏览器环境下如果测试用例跑完后不主动销毁Angular测试模块、组件实例和关联DOM节点,会出现持续内存泄漏,后续用例执行速度会随测试数量增加线性下降。该选项的优化逻辑就是在每个it用例跑完后自动销毁当前测试模块,清理内存占用。- Jest环境默认自带更强的隔离清理机制:Jest跑Angular测试时大多搭配jsdom模拟DOM环境,Jest默认会在每个测试文件/测试块执行完成后自动清空整个jsdom上下文、销毁所有已创建的JS实例和DOM节点,本身就不存在
DestroyAfterEach要解决的内存堆积问题,因此该选项的优化收益几乎为0,看不到明显提速是正常现象。
只有当你手动关闭了Jest默认的上下文隔离、且测试用例数量极大的情况下,才可能观察到DestroyAfterEach带来的小幅提速,其余场景无收益均为正常情况。
如何确认配置是否正确
如果要排除配置错误的可能,可以按以下方法校验:
- 确认配置入口正确:
若使用Angular 12.1~13版本,需要在测试启动文件(通常是src/test.ts)的TestBed.initTestEnvironment调用中添加配置,示例如下:
若使用Angular 14及以上版本,也可以直接在TestBed.initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { destroyAfterEach: true } );angular.json的test配置块中添加全局配置:"test": { "options": { "teardown": { "destroyAfterEach": true } } } - 简单校验配置生效:可以新增一个临时测试用例,在组件测试的
afterEach钩子中验证组件的ngOnDestroy生命周期是否被触发,若正常触发则说明配置生效,无提速完全是环境差异导致。
内容的提问来源于stack exchange,提问作者Benjamin Kindle
相关产品推荐
相关产品推荐

