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