Как сообщить об ошибках JavaScript во время функциональных тестов с помощью Intern?

Как я могу сообщить об ошибках JavaScript, возникающих во время выполнения теста, с помощью Intern? По сути, если на странице есть какие-либо ошибки JavaScript (даже как часть вещей, которые явно не проверены), я хочу знать.

Фон

Я только начинаю работать с Intern и тестировать в целом, и я пытаюсь протестировать все основные страницы своего сайта во всех браузерах, потому что я только что изменил весь наш JavaScript для загрузки через require.js. Хотя в Chrome это выглядит хорошо, в прошлом у меня были проблемы с require.js и случайными браузерами, поэтому я хотел все автоматизировать. Наиболее вероятная проблема, которая может возникнуть, заключается в том, что некоторые случайные JS не будут выполняться из-за асинхронной загрузки и загрузки ожидаемого глобального. Поскольку текущей настройки тестов нет, я в основном хочу начать с запуска «теста», пройти по всем основным страницам и сообщить о любых ошибках JavaScript.


person jon_wu    schedule 26.07.2014    source источник


Ответы (1)


Чтобы сообщать о неперехваченных ошибках, вам нужно перехватить метод 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 г.) ошибки от window.onerror во всех браузерах, кроме последних версий Chrome, предоставляют только сообщение, источник сценария, номер строки и (иногда) номер столбца, поэтому эта информация будет полезна только для того, чтобы сказать, что «это действие вызвало ошибка, сделайте это вручную, чтобы получить трассировку стека».

Во время модульных тестов Intern уже пытается автоматически перехватывать любые необработанные ошибки и рассматривать их как фатальные ошибки, которые останавливают работу системы (поскольку у вас никогда не должно быть кода, который генерирует такого рода необработанные ошибки).

person C Snover    schedule 05.08.2014
comment
Спасибо @CSnover за это и за вашу потрясающую работу над Intern и TraceKit среди прочего. Я использовал getLogsFor('browser'), но потом понял, что не все браузеры его поддерживают. Это звучит как лучшее решение, и, возможно, я мог бы добавить этот код в ‹head› во время тестов, чтобы отловить все ошибки. - person jon_wu; 05.08.2014
comment
Чтобы получить стеки в Chrome: blog.bugsnag.com/js-stacktraces (раздел: Good ) - person Kiechlus; 11.08.2016