排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器

Posted

技术标签:

【中文标题】排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器【英文标题】:Detox Testing: Tracking down Javascript timers causing test framework to wait forever 【发布时间】:2018-10-12 21:40:07 【问题描述】:

Detox 测试框架,根据文档TroubleShooting Synchronization 提到,测试框架将等待并且仅在应用程序“空闲”时执行您的下一个测试语句。

我现在遇到的问题是我的应用永远不会空闲,因为有一些超时持续触发。它可能在我的代码或第三方代码中。

这是一个输出示例:

正如您所见,每隔几毫秒就会创建一个新计时器。我想做的是追踪哪一个,我可以看到 id,但不知道尝试追踪这个 (setTimeout) id 的确切来源的好方法。

我曾想过封装 setTimeout 函数,但不知道最好的方法是什么。 我可以在我自己的代码中消除或至少将setTimout 包装起来,这样至少可以确定它是第三方库(这仍然无助于解决问题)。

【问题讨论】:

不是答案,但帮助我找到了解决方案。在./node_modules/detox/src/client/actions/actions.js 内部有一个名为CurrentStatus 的类,其中以下行被注释掉了://console.log("res:" + JSON.stringify(response, null, 2));handle 方法内部。它提供了有关计时器设置位置的更可靠的信息。希望有帮助。 Detox 11.0.1 【参考方案1】:

您可以通过以下方式轻松追踪 setTimeouts:

 // DEV mode only!
 function failOnTimeout(func) 
   const setTimeout = f => 
     throw new Error(`Executing timeout \n $f.toString() \n`);
   ;

   // A small trick to change scope:
   eval("(" + func.toString() + ")()");

所以你可以这样做:

 failOnTimeout(someMysteriousFunction);

并且会为您提供该函数中设置的第一个超时的堆栈跟踪(同步)。然后,您可以将其注释掉并搜索下一个。


但不是跟踪所有超时,一个快速的解决方案可能是抛出一个未捕获的错误来结束进程。

【讨论】:

以上是关于排毒测试:跟踪导致测试框架永远等待的 Javascript 计时器的主要内容,如果未能解决你的问题,请参考以下文章

信号量等待导致 AFNetworking 阻塞?

如何为排毒 e2e 测试提供自定义测试文件路径

排毒测试 + React Native + PouchDB 应用程序:由于一些 PouchDB 同步,我们的登录测试一直失败并超时?

排毒:使用多个元素匹配器会导致错误

Pubnub 阻止排毒同步

Detox IOS - 由于连续动画错误导致测试失败,disableSynchronization 不起作用