16 февр. 2012 г.

Unit-тестирование JavaScript в JsTestDriver

В IDE WebStorm увидел интересный фреймворк JsTestDriver для unit-тестирования JavaScript. Кратко перечислю список основных достоинств:
  1. Плагины под IDE от JetBrains (включая WebStorm 3+), Eclipse 3.6+ (включая Aptana 3+).
  2. Практически никаких ручных манипуляций с браузерами - запуск сервера тестирования, браузеров, перезапуск тестов происходят в одно нажатие кнопки мышкой в IDE.
  3. Результаты прохождения тестов отображаются в IDE, открыть в редакторе нужный (провалившийся) тест можно по double-click на его названии.
  4. Выполняет тесты в нескольких браузерах одновременно. Можно подключить сразу целый зоопарк: мартышка, осёл, козёл и косолапый мишка (осёл, само собой, ИЕ, а насчёт остальных думайте сами).
  5. Никакой возни с созданием HTML-странички и подключением тестируемых/тестирующих скриптов, как это было в unittest и qunit. Скрипты подключаются один раз в файле с расширением jstd (как некий аналог classpath в Java), можно использовать маски типа src/*.js. После этого пишем только скрипты тестов, ничего более.
  6. Фикстуры (фрагменты HTML) создаются декларативно прямо в тексте теста. Фреймворк сам создаёт соответствующие фрагменты HTML в браузере во время выполнения теста. Картинки и прочие ресурсы можно подключить в параметре serve в конфигурационном файле jstd.
Кстати, вот как реализуется задержка при выполнении теста (например, для того, чтобы браузер успел отреагировать на манипуляции с DOM или дождался ответа на AJAX-запрос):

AsyncTestCase("test case name", {
  testWithWait: function(queue) {
    // код

    queue.call("Wait", function(callbacks) {
      setTimeout(callbacks.noop(), 100); // пауза на 100 мс
    });

    queue.call("Test", function(callbacks) {
      assert(...); // проверки
    });

    queue.call("Wait", function(callbacks) {
      setTimeout(callbacks.noop(), 100); // ещё одна пауза
    });

    queue.call("Test", function(callbacks) {
      assert(...); // проверки
    });
  }
});

3 комментария:

  1. Доброго времени суток. Если будет время и желание, помогите, пожалуйста, разобраться. Только начинаю работать с jsTestDriver, потому не всё удаётся. При попытке запустить сервер + тесты, как написано в документации, консоль на команде о сервере зависает и не дает выполнить следующую, собственно, с тестами. Попытки обойти это с помощью дубликата консоли или батника для тестов, успехом не кончились. Отчего может такое происходить - непонятно..

    ОтветитьУдалить
    Ответы
    1. Извините за задержку с ответом - лежал в больнице. Я в принципе вручную сервер не запускал - с этим прекрасно справляется IDE (WebStorm, Eclipse, Aptana 3). Насколько понял, команда запуска сервера и команда запуска тестов должны запускаться в разных консолях, это видно в демо-ролике http://www.youtube.com/watch?v=V4wYrR6t5gE - сервер запускается в одной консоли и не зависает, он пишет в консоль информацию о подключившихся браузерах, тесты запускаются в другой консоли.

      Удалить
    2. Ничего страшного. Поправляйтесь и спасибо большое за отзывчивость

      Удалить