Ajax-ориентированная среда выполнения JavaScript

Во время работы над большим веб-приложением с увеличением количества кода JavaScript мы провели мозговой штурм о том, как улучшить качество кода.

Одна из первых идей заключалась в том, чтобы ввести модульные тесты. Это будет долгосрочной целью; что, однако, не будет исправлять наиболее распространенные причины регрессии: изменения DOM и специфические проблемы браузера.

Тестирование модулей выполняется в среде с надстройкой без DOM и не находится на странице.

Я ищу структуру утверждения, которая может быть вставлена ​​в код следующим образом:

var $div = $("div.fooBarClass");
assertNotEmpty($div);
$div.fooBarAction();

Я нашел фреймворки утверждения, которые могут это сделать, но все они либо заходят в консоль, либо в DOM, либо открывают глупые всплывающие окна. Ни одна из них не работает вместе с (тысячами) автоматизированных тестов. То, что я ищу, - это платформа утверждения времени выполнения, которая регистрирует неудавшееся утверждение через AJAX! В идеале это должно быть:

  • Соблюдайте общие утверждения.
  • Интеграция с модулями JQuery, закрытие.
  • Записать (через Ajax) утверждение, имя файла, страницу, номер строки, причину сбоя, некоторые предварительно сконфигурированные переменные среды (браузер, версия выпуска и т.д.).
  • Поддержка обратных вызовов в случае сбоев. (Если любая структура утверждения может просто сделать это, я с удовольствием захочу написать обратные вызовы, выполняющие часть Ajax.)
  • Хорошо работать со всеми браузерами.
  • Тривиальное исключение из выпуска продукта.
  • Поддерживаемая база кода.

Ответ 1

Мы использовали YUI Test Library. Кажется, он работает достаточно хорошо.

Имеет множество методов утверждения для разных типов

Утверждения существуют для сопоставления равенства, идентичности, истины, false, типа объекта и даже сравнения элементов массива.

Позволяет mock-объектам проверять объекты DOM и другие функции Наш код выполняет много вызовов AJAX или требует методов/объектов, которые не нуждаются в проверке (поскольку они протестированы в другом месте). Используя Mock-объекты, мы можем рассказать о тестах, чего ожидать. Например:

var mockXhr = Y.Mock();

//I expect the open() method to be called with the given arguments
Y.Mock.expect(mockXhr, {
    method: "open",
    args: ["get", "/log.php?msg=hi", true]                            
});

Работает со всеми браузерами

Мы запускаем наши тесты в IE, Chrome и Firefox, и помимо некоторых различий в том, как выглядит сам тестовый бегун, он работает!

Тривиальное исключение из выпуска продукта

У нас есть весь наш тестовый код в отдельной папке, которая обращается ко всему производственному коду. Исключение тестов из производства так же просто, как исключение папки.

Поддерживаемая кодовая база

YUI 3 используется на домашней странице Yahoo и, по-видимому, довольно хорошо поддерживается.

Ответ 2

Я знаю, что это не то, о чем вы просили, но я настоятельно рекомендую Selenium для автоматического тестирования веб-приложений.

  • Собственные утверждения встроены.
  • Он может тестировать любую инфраструктуру JS, потому что он управляет браузером, где работает ваш код.
  • Он обладает надежными функциями ведения журнала.
  • Поддержка браузера зависит от вашей ОС, но поддерживаются все основные браузеры.
  • Нечего исключать из производственного выпуска, потому что тесты являются внешними для приложения.
  • База кода хорошо поддерживается, и вы полностью контролируете свои тестовые примеры.

Ответ 3

Кажется, нет похожего решения, которое я ищу.

Я собираюсь написать свой собственный, переопределяя console.assert, чтобы сделать вызов ajax, когда аргументы оцениваются как false.

UPDATE: здесь он все еще находится в разработке, https://github.com/gaboom/qassert