如何在功能测试期间使用Intern报告JavaScript错误

How to report JavaScript errors during functional tests using Intern?

本文关键字:Intern 报告 JavaScript 错误 功能测试      更新时间:2023-09-26

我如何使用Intern报告在测试执行期间发生的JavaScript错误?基本上,如果页面上有任何JavaScript错误(即使是未明确测试的内容的一部分),我想知道。

我刚刚开始使用实习生和一般测试,我试图在所有浏览器中测试我网站上的所有主要页面,因为我刚刚更改了我们所有的JavaScript以通过require.js加载。虽然它在Chrome中看起来不错,但我过去在require.js和随机浏览器上遇到过问题,所以我想让一切都自动化。最可能出现的问题是,由于异步加载和加载预期的全局变量,一些随机的JS将无法执行。由于目前没有测试设置,我基本上想从运行"测试"开始,通过所有主要页面并报告任何JavaScript错误。

为了报告未捕获的错误,您需要挂钩页面的window.onerror方法。这是可能的,但是页面加载需要在添加钩子之前完成,这意味着在页面加载之前/期间发生的任何错误(或在页面卸载时发生的错误)都无法被捕获和报告。这也意味着,如果您执行移动到新页面的操作(如表单提交),则需要确保在执行导致导航的操作之前检索错误列表,并在到达新页面后重新配置window.onerror处理程序。

要用功能测试执行这样的报告,您的测试最终看起来像这样:
return this.remote
  .get('http://example.com')
  .execute(function () {
    window.__internErrors__ = [];
    window.onerror = function () {
      __internErrors__.push(Array.prototype.slice.call(arguments, 0));
    };
  })
  // ... interact with the page ...
  .execute(function () {
    return window.__internErrors__;
  })
  .then(function (errors) {
    // read `errors` array to get list of errors
  });

请注意(截至2014年8月)window.onerror在所有浏览器中的错误,除了最近版本的Chrome只提供消息,脚本源,行号和(有时)列号,所以这个信息只会有用的说"这个动作导致了一个错误,去手动做它来获得堆栈跟踪"。

在单元测试期间,Intern已经尝试自动捕获任何未处理的错误,并将它们视为导致系统停止的致命错误(因为您永远不应该有生成这种未处理错误的代码)。