Моя основная структура JavaScript - jQuery, поэтому я хотел бы, чтобы мои фреймворки модульного тестирования и имитации были совместимы с этим. Я бы предпочел не вводить еще один фреймворк JavaScript.
В настоящее время я использую QUnit для модульного тестирования и Джек для имитации, но я новичок во всем модульном тестировании JavaScript.
Можно ли предложить лучший инструмент? Что сработало для вас?
Тестирование QUnit намного проще с помощью Grunt



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я знаю, что вы просите jQuery-совместимые фреймворки, но я хочу добавить script.aculo.us для полноты картины. У них есть неплохой набор модульный тест.
Когда я взглянул на него, CrossCheck показался мне чрезвычайно мощным, но в настоящее время мы не включали его в наш процесс сборки. Он имеет то преимущество, что не имеет браузера, и поэтому должен хорошо работать в сценарии автоматической сборки и тестирования.
JsUnit запускается либо из браузера через его плагин Eclipse, либо автоматически через задачу Ant. Вы создаете HTML-страницу с набором тестовых функций, которые должны называться с префиксом «test», включая тестируемый файл JavaScript. Когда какое-либо утверждение в функции терпит неудачу, вся функция терпит неудачу и прекращает выполнение. Нет гарантированного порядка, в котором выполняются эти тесты. Вы можете создавать функции setup() и teardown().
Лицензия: GPL, GLPL и MPL
Плюсы
Минусы
QUnit
jqUnit
Написание тестов JavaScript с помощью QUnit и jqUnit
QUnit - это фреймворк модульного тестирования для фреймворка jQuery JavaScript. Сама среда тестирования использует библиотеку jQuery, но тесты могут быть написаны для любого JavaScript и не требуют кода для использования jQuery.
jqUnit - это модифицированная версия QUnit, которая добавляет функции настройки, удаления и утверждения, которые более типичны для платформы xUnit, и инкапсулирует все в одну глобальную переменную.
Визуальный интерфейс страницы testrunner приятный, позволяющий детализировать и видеть каждое утверждение в каждом методе тестирования. Написание тестов довольно просто, и вы можете запустить тестовый код прямо на странице testRunner [8]. Это позволяет легко и наглядно тестировать DOM.
QUnit: MIT или GPL (выберите) jqUnit: Лицензия MIT
Плюсы
Минусы
Один из минусов теперь можно убрать: QUnit больше не требует jQuery.
Другой недостаток также был удален: теперь вы можете запускать автоматические тесты QUnit из .NET с помощью NQUnit (robdmoore.id.au/blog/2011/03/13/…)
Также последние минусы уходят с code.google.com/p/js-test-driver
YUI Test - это тестовая среда для библиотеки Пользовательский интерфейс Yahoo (YUI). Он используется Yahoo для тестирования собственной библиотеки и имеет синтаксис, аналогичный JUnit.
Как и jsUnit, YUI Test поставляется с собственной консолью ведения журнала, которая может выводить информацию, предупреждения и ошибки в дополнение к результатам каждого теста.
YUI также предоставляет возможность отправлять отчеты для результатов в формате JSON или XML.
YUI Test имеет лицензию BSD.
Плюсы
Минусы
Мы использовали jsspec. Очень приятно, если вам нравятся rspec и BDD. Я только что видел статья Джастина Гетланда при использовании его "без головы".
Вы можете попробовать HtmlUnit, у которого более года назад был выпуск, совместимый с jQuery.
Преимущество HtmlUnit в том, что он не управляет браузером, поэтому это быстрый.
Обратной стороной является то, что он не управляет браузером, поэтому некоторые вещи JavaScript не работают. Но компенсируя это тем, что они могут запускать тесты jQuery, поддержка JavaScript может быть достаточно хорошей для того, что вам нужно.
Для имитации в JavaScript взгляните на qMock, фреймворк, который я и мой коллега написали, чтобы дополнить наше использование QUnit. Хотя последний отлично подходит для модульных тестов, он не позволяет проводить очень эффективное тестирование асинхронной / бизнес-логики. Мы не «пометили» ни один выпуск как стабильный, но там есть неплохая документация, и если вы проверите репозиторий SVN, вы увидите, что сам qmock имеет за собой модульные тесты, которые не требуют пояснений.
Да, и чтобы автоматизировать тестирование как часть сборки, мы использовали простой скрипт Selenium для навигации по нашему набору тестов (одна тестовая страница на файл JavaScript) и «прослушивали» класс CSS «прошел или не прошел» (добавлен QUnit). Это работает без головы, а также для Internet Explorer и Firefox 2, AFAIK.
Что касается разработки Firefox, я влюбился в UXU, основанный на MozUnit, но он все еще активен. У него есть приятные функции, такие как фиктивный сервер и методы sleep / yeld.
Я использую тестовую среду Screw Unit и написал свой собственный издевательская библиотека под названием jsMocha, который активно используется в компании, в которой я работаю, более 6 месяцев.
Я не уверен, почему никто не упомянул JsTestDriver! Это должен быть один из немногих инструментов тестирования JavaScript, который действительно работает так, как вы ожидаете, если вы использовали инструменты модульного тестирования на других языках.
Запуск тестов можно выполнять, не касаясь браузера, вы можете интегрировать его с IDE, и вы можете интегрировать его с системами непрерывной интеграции ... Да, и это быстро, и может запускать тесты в нескольких браузерах одновременно.
Вы также можете использовать с ним другие среды тестирования, такие как YUITest, что сделает его еще лучше.
Я думаю, что Jack - лучший фреймворк для имитации JavaScript на момент написания этой статьи. Основная причина в том, что то, что подходит для JavaScript, вряд ли подходит для строго типизированного языка, такого как Java.
Многие фреймворки имитации JavaScript вдохновлены фреймворками имитаторов Java (такими как, например, превосходный JsMockito). Но проблема в том, что это инъекция зависимостей требовать, потому что это почти единственный разумный способ использования имитации в Java. Но в JavaScript есть способы много использовать насмешку, и вы не принужденный в использовании внедрения зависимостей повсюду.
Например, с JsMockito вам нужно сделать mocks, а затем передать эти издевательства в вашего тестируемого программного обеспечения (SUT). SUT должен вызывать макеты напрямую. Следовательно, вы вынуждены кодировать SUT как конструктор или функцию, которая принимает все свои зависимости в качестве параметров. (Иногда это прекрасный способ реализовать это, но не во всех случаях. Хвост виляет собакой, если дизайн вашего фреймворка заставляет ваш подход к реализации.)
В JavaScript очень легко «взломать» любую функцию. Следовательно, существует множество способов создать что-то такое, что вы можете имитировать его части, не вводя явно его зависимости. Например, Джек позволяет вам имитировать функцию Любые, независимо от того, является ли она общедоступной или для локального объекта. Оттуда вы можете следить за ним, заглушать его или выражать свои ожидания. Ключевой момент такой: как только вы имитируете функцию, вызовы Любые этой исходной функции вместо этого будут направлены на ваш макет. Другими словами, ваши макеты по-прежнему будут использоваться, даже если была вызвана исходная функция без фиксации. В результате вам не нужно вводить зависимости, хотя вы, безусловно, можете сделать это в тех случаях, когда это необходимо.
JavaScript - это другой язык, чем Java (и C# и т. д.). Это позволяет использовать разные идиомы реализации. Внедрение зависимости по-прежнему является одним из ценных инструментов в наборе инструментов в JavaScript, но это уже не единственная игра в городе. Ваш фреймворк насмешек должен знать и уважать этот факт. Джек и пара других делают это, но из тех, кто это делает, Джек кажется наиболее зрелым и многофункциональным.
Ненавижу ставить +1 к чему-то, но это действительно хорошая трактовка концепции насмешки в JS.
Также проверьте http://sinonjs.org/
У него есть тестовые шпионы, тестовые заглушки, моки, поддельные таймеры, поддельный XMLHttpRequest (XHR), поддельный сервер, песочница и утверждения.
Он действительно работает вместе с QUnit, и до сих пор это был плюс.
Это довольно хороший обзор имитирующих фреймворков, доступных для JavaScript:
http://testdrivenwebsites.com/2010/05/06/java-script-mock-frameworks-comparison
Ссылка не работает: «К сожалению, запрошенная страница не может быть найдена».
Библиотека / ссылка Джека, кажется, мертва.