Статьи

Тестирование и указание кода JavaScript с помощью Jasmine

Jasmine — это инфраструктура BDD для кода JavaScript (или CoffeeScript), которая помогает вам одновременно указывать и тестировать ваши классы и функции.

Jasmine не является производным от классического API xUnit, но имеет синтаксис Behavior-Driven Development, состоящий из простых и коротких вызовов методов.

Каркас разработан Pivotal Labs, той же компанией, что и Pivotal Tracker (один из немногих инструментов планирования Agile, который предположительно работает) и Pivotal CRM. Викимедиа Коммонс и Диаспора, просто чтобы привести пример, используют Жасмин, и я узнал о его распространении на последнем Глобальном дне ретрита кода.

У меня уже есть jsTestDriver!

Что касается другой стороны инфраструктуры тестирования , документация делает некоторые убедительные замечания

  • Жасмин не привязан ни к браузеру, ни даже к браузерам в целом: он может работать везде, где поддерживается JavaScript, а также в консоли.
  • Его API прост (такой же, как для jsTestDriver) и имеет небольшую кривую обучения: через несколько минут вы сможете запустить практически любой модульный тест.
  • Фреймворк не загромождает глобальное пространство имен и не перепрыгивает через ужасные скачки, на которые постоянно указывает статический анализ кода.

Где его запустить

Есть несколько вариантов запуска Жасмин:

  • в браузере ; HTML-файл загружает все файлы .js и показывает результат пакета. У Jasmine также есть интерактивная консоль для проверки его синтаксиса, связанного с ресурсами.
  • В нескольких браузерах с jsTestDriver в качестве бэкэнда.
  • Через жемчужину для усыновителей Ruby или Coffeescript.
  • Через консоль, в случае приложений Node.js.

Использование браузера на самом деле самое простое: вам просто нужно отредактировать SpecRunner.html, добавив теги <script> для ваших исходных файлов и спецификаций.

Вот как выглядит Jasmine после того, как я запустил его из git checkout (в этом случае вам нужно будет отредактировать пути к примеру файла SpecRunner.html):

Как выглядит Жасмин

Написание
спецификаций

тестов
с помощью Jasmine действительно просто:

describe('prime numbers detector',function(){
  it('avoids 1',function(){
    expect(isPrime(1)).toBe(false);
  });
  it('detects 2',function(){
    expect(isPrime(2)).toBe(true);
  });
  it('detects 3',function(){
    expect(isPrime(3)).toBe(true);
  });
  it('avoids 4',function(){
    expect(isPrime(4)).toBe(false);
  });
});

Этот пример кода описывает функцию isPrime (), но вы можете запустить любой код JavaScript внутри анонимных функций, переданных ей (). Вы также можете добавить вызов beforeEach (function () {}) перед it (), чтобы указать настройку, общую для всех тестов.

toBe () — универсальное средство сопоставления, но есть много других, чтобы ваша спецификация читалась:

  • Ожидайте (x) .toBeNull (), ожидайте (x) .toMatch (/ [AZ] * /), ожидайте (x) .toBeLessThan (42) — все примеры работы с нечисловыми переменными.
  • Ожидается (функция () {fn ();}). toThrow (e) позволяет указать ожидаемое исключение.
  • wait (x) .not.toEqual («hello») — это общий шаблон (wait (x) .not), который вы можете использовать вместо wait (x) для инвертирования поведения сопоставителя.

Действительно удобный материал

Жасмин содержит примитивы для организации тестов, связанных с асинхронностью:

  • run () является базовым элементом, определяющим фрагмент кода, который будет выполнен.
  • waits (timeout) может быть вставлен между блоками run (), чтобы обеспечить подушку ожидания, которую трудно получить, поскольку в JavaScript отсутствуют функции сна.
  • waitsFor (fn) повторно проверяет условие, гарантируя, что выполнение продолжается только после его достижения.

Концепция waitsFor () похожа на явные ожидания Selenium 2 , но может использоваться для тестирования только части JavaScript, а не всего приложения (например, путем подделки серверной части). Jasmine — это решение, ориентированное на код JavaScript, а не на сквозные тесты.

Асинхронность активно используется в вызовах Ajax, а также в рендеринге и другой логике в сложных средах, таких как ExtJS, которая полна отложенных вызовов. Аутсорсинг фреймворка сложности тестирования асинхронного кода, как правило, положительный.

Другие источники

Официальная страница для Жасмин содержит несколько загрузки пакетов для запуска его в браузере или консольных средах. Он также ссылается на страницы разработки на Github и документацию API.

Вы можете попробовать Jasmine (но не сохраняете свой код) сразу после прочтения этой статьи, если «загрузка zip-файла — это слишком много работы!» Список рассылки для Жасмин также довольно активен.

Nettuts + имеет длинный пример цикла BDD / TDD с примером проекта для загрузки и запуска. Там никогда не бывает достаточно примеров кода, когда они нам нужны. Джаред Кэрролл объясняет, как происходит интеграция фреймворка с jQuery (где это необходимо).