Поскольку Jasmine поддерживается в свободное время, релизы не всегда выходят вовремя. Мы стремимся выпускать второстепенную версию (стратегия управления версиями) каждые несколько месяцев в зависимости от количества функций, добавленных с момента последней версии. Эта цель может быть сдвинута, если у нас не будет времени добавить функциональность или слить пулл-реквесты, поскольку количество новых функций с момента последнего релиза может показаться недостаточно большим, чтобы оправдать новый релиз. Кроме того, несмотря на то, что мы стараемся что-то ломать, когда в второстепенном выпуске нарушается какая-то функциональность, мы делаем все возможное, чтобы исправить проблемы в выпусках исправлений как можно быстрее.
Жасмин максимально старается соблюдать семантическое управление версиями. Это означает, что мы резервируем основные версии (1.0, 2.0 и т. д.) для критических изменений или другой важной работы. Большинство выпусков Jasmine в конечном итоге являются второстепенными выпусками (2.3, 2.4 и т. д.). Основные выпуски выходят очень редко.
Основные библиотеки привязки (jasmine-py, jasmine-gem и jasmine-npm) имеют ту же основную и дополнительную версии, что и версия jasmine-core, от которой они зависят. Это означает, что при обновлении зависимости от jasmine вы также получите новейшую версию jasmine-core. Выпуски исправлений (2.4.2, 2.6.3 и т. д.) обрабатываются отдельно: выпуск исправлений jasmine-core не требует соответствующего выпуска исправлений jasmine или наоборот.
версии jasmine-browser-runner различаются, потому что они новее и не такие зрелые, как jasmine-core . Номера его версий не связаны с номерами версий jasmine-core. Он объявляет jasmine-core как одноранговую зависимость. Последние версии yarn и npm автоматически установят для вас совместимую версию jasmine-core, или вы можете указать версию, добавив ее как прямую зависимость вашего пакета.
Jasmine обычно не прекращает поддержку браузерных версий или версий Node, за исключением основных выпусков. Исключениями являются версии Node, срок службы которых истек, браузеры, которые мы больше не можем устанавливать локально и/или тестировать в наших сборках CI, браузеры, которые больше не получают обновления безопасности, и браузеры, которые работают только в операционных системах, которые не поддерживаются. больше не получать обновления безопасности. Мы приложим разумные усилия, чтобы Jasmine работала в этих средах, но не обязательно будем выпускать основной релиз, если они сломаются.
Да. Точный процесс зависит от того, как вы используете Jasmine:
Мы можем протестировать наши приложения Angular с нуля, написав и выполнив функции на чистом JavaScript. Создание экземпляров соответствующих классов, вызов функций и проверка фактического результата по сравнению с ожидаемым.
Но, поскольку тестирование — это распространенная деятельность в JavaScript, мы можем использовать ряд библиотек и сред тестирования, которые сокращают время, необходимое для написания тестов.
Два таких инструмента и среды, которые используются при тестировании Angular, — это Jasmine и Karma, и их обсуждение является темой этой лекции.
Jasmine – это платформа для тестирования JavaScript, поддерживающая метод разработки программного обеспечения, который называется Behaviour-Driven Development (сокращенно BDD). Это особая разновидность разработки через тестирование (TDD).
1 | Функция description(string, function) определяет то, что мы называем Test Suite, набор отдельных Спецификации теста. |
2 | Функция it(string, function) определяет отдельную спецификацию теста, содержит одно или несколько тестовых ожиданий. |
3 | Выражение expect(actual) — это то, что мы называем Ожидание. В сочетании с Matcher он описывает ожидаемое поведение в приложении. |
4 | < td>Выражение сопоставителя (ожидаемое) — это то, что мы называем сопоставителем. Он выполняет логическое сравнение ожидаемого значения, переданного в функцию ожидания, с фактическим значением, переданным в функцию ожидания, если они ложны, spec терпит неудачу.
< /таблица>
Сопоставители
Jasmine поставляется с несколькими готовыми сопоставителями, такими как:
Установка и демонтаж
Иногда, чтобы протестировать функцию, нам нужно выполнить некоторые настройки, например, создать несколько тестовых объектов. Также нам может понадобиться выполнить некоторые действия по очистке после завершения тестирования, возможно, нам потребуется удалить некоторые файлы с жесткого диска.
Эти действия называются setup и teardown (для очистки), и в Jasmine есть несколько функций, которые можно использовать, чтобы упростить эту задачу:
Эта функция вызывается один раз, перед выполнением всех спецификаций набора тестов (функция описания).
Эта функция вызывается один раз после завершения всех спецификаций в наборе тестов.
Эта функция вызывается перед запуском каждой тестовой спецификации (функция it).
Эта функция вызывается после выполнения каждой спецификации теста.
Несмотря на то, что преимущества автоматизированных тестов хорошо известны, настройка любой новой тестовой среды может оказаться сложной и трудоемкой задачей. Если вы пишете на JavaScript — языке, который находится где-то посередине между объектно-ориентированным и функциональным программированием, понять, что тестировать, тоже может быть непросто. Это руководство объяснит основы тестирования с помощью Jasmine JS и поможет вам начать писать тесты до того, как вы успеете сказать «консольный журнал, привет, мир!»
Это общее представление о том, что мы будем освещать в посте:
- Основы Жасмин JS
- Начало работы с Жасмин
- Анатомия набора тестов Jasmine
К концу поста у вас будет не только четкое представление о Жасмин с теоретической точки зрения. Вы также на практике узнаете, как проводить тестирование с помощью этого инструмента. И у вас будет отличная отправная точка, от которой вы сможете продолжать строить. Начнем.
Основы Жасмин JS
Прежде чем засучить рукава и приступить к тестированию с помощью Jasmine, важно иметь четкое представление об основах этого инструмента тестирования.
Итак, давайте начнем с ответов на некоторые распространенные вопросы о платформе, чтобы вы могли точно понять, что такое Jasmine и какую роль он играет в общей стратегии автоматизированного тестирования.
Что такое Jasmine JS?
Jasmine – это платформа для модульного тестирования JavaScript. Это с открытым исходным кодом и имеет почти 15 000 звезд на GitHub. Его популярность среди разработчиков означает, что у него есть сильное сообщество и доступная документация, когда вы застряли.
Разработчики Angular особенно отдают предпочтение Jasmine, потому что Jasmine изначально включен в проекты Angular.
Ценность Jasmine заключается в простоте настройки и написания тестов. Для нас это отличная новость, потому что теперь мы собираемся погрузиться в настройку Jasmine!
Для чего используется Jasmine Framework?
Как вы только что видели, Jasmine – это инструмент тестирования, используемый для модульного тестирования, которое является одним из наиболее важных типов автоматизированного тестирования. Однако он далеко не единственный. В частности, когда речь идет о веб-приложениях, ваша стратегия тестирования требует многих типов тестирования, включая сквозное тестирование, нагрузочное тестирование и тестирование пользовательского интерфейса.
Расширьте охват тестами
Другими словами: Jasmine сосредоточьтесь на нижней части пирамиды автоматизации тестирования.
Является ли Jasmine BDD Framework?
Jasmine описывает себя как среду разработки, управляемой поведением (BDD), для тестирования JavaScript. Не позволяйте этому помешать вам использовать его, даже если вы не используете BDD как таковой. У нас есть целый пост, посвященный этой дилемме, но вот TL;DR: Jasmine отлично подходит для многих стилей тестирования, и он вообще не является эксклюзивным для BDD.
Начало работы с Жасмин
Разобравшись с основами, пришло время запачкать руки. Давайте посмотрим, как быстро пройти путь от нуля до героя в Jasmine!
Настройка Жасмин
Прежде чем приступить к настройке, давайте рассмотрим принципы настройки Jasmine. Вот что мы собираемся сделать на высоком уровне:
- Предоставьте своему коду доступ к Jasmine, загрузив его вручную или с помощью диспетчера пакетов.
- Инициализировать Жасмин
- Создать файл спецификации (теста)
- Сделайте исходный код доступным для вашего файла спецификации.
Тогда мы готовы к тестированию! Не беспокойтесь — сначала мы подробно рассмотрим, как настроить Jasmine.
Загрузить и настроить Jasmine
Когда мы используем автономную версию Jasmine, мы загружаем ее и вручную помещаем в проект. Этот способ запуска отлично подходит, если вы просто хотите посмотреть, как все это работает.
Начните с загрузки дистрибутива со страницы выпусков Jasmine. На момент написания этой статьи последняя версия — 3.8.0.
Затем создайте новый каталог и создайте новый подкаталог с именем Jasmine.
Jasmine — одна из самых популярных сред тестирования JavaScript. Его тесты интуитивно узнаваемы по их формату описания. Jasmine вдохновлен Behavior-Driven Development и поставляется со многими базовыми функциями «из коробки». Хотя Jasmine известен своей поддержкой Node.js, он также поддерживает Python и Ruby. Jasmine также работает с языками на основе JavaScript, такими как TypeScript и CoffeeScript.
В этом руководстве показано, как писать тесты на JavaScript для Node.js с помощью Jasmine. Он использует проект jasmine-node-js-example (размещенный на GitHub). Содержание включает:
- Основные модульные тесты белого ящика
- Тесты интеграции REST API с frisby
- Сквозные тесты веб-интерфейса с помощью Protractor
- Шпионаж с Синон
- Исправление Monkeypatch с повторным подключением
- Обработка данных конфигурации с помощью файлов JSON
- Расширенные возможности исполнения с Karma
- Особые замечания по проектам Angular
Справочник API Jasmine также незаменим при написании тестов.
Настройка и установка
В официальном руководстве по установке Jasmine Node.js объясняется, как настроить и установить Jasmine. Тесты Jasmine можно добавить в существующий проект или в совершенно новый проект. В качестве предварительного условия должен быть установлен Node.js. Используйте следующие команды для настройки.
Код, используемый в этом руководстве, доступен на GitHub по адресу jasmine-node-js-example. Не стесняйтесь клонировать этот репозиторий, чтобы попробовать все сами!
Рекомендуемые редакторы и IDE включают Visual Studio Code с расширениями Jasmine Snippets, Atom и JetBrains WebStorm.
Структура проекта
Jasmine не требует, чтобы проект имел определенный макет каталога, но использует файл конфигурации, чтобы указать, где искать тесты. Обычная структура проекта по умолчанию, созданная с помощью «jasmine init», помещает весь код Jasmine в каталог «spec», который содержит файлы «*spec.js» для тестов, помощников, запускаемых перед спецификациями, и каталог поддержки для конфигурации. Переменная среды JASMINE_CONFIG_PATH может быть установлена для изменения используемого файла конфигурации. (Файл конфигурации по умолчанию — spec/support/jasmine.json.)
Эту структуру можно изменить с помощью свойств «spec_dir», «spec_files» и «helpers» в файле конфигурации. Например, может быть полезно изменить структуру, включив в иерархию более одного уровня каталогов. Однако, как правило, лучше оставить обычный макет каталога. Значения конфигурации по умолчанию для Jasmine 2.8 приведены ниже.
Кроме того, рекомендуется разделить тесты между разными уровнями пирамиды тестирования. В примере проекта есть подкаталоги spec для модульных, интеграционных и сквозных тестов. Организация на уровне каталога позволяет легко фильтровать тесты по уровню при выполнении.
Модульные тесты для функций
Самая основная единица кода, подлежащая тестированию в JavaScript, — это функция. Модуль lib/calculator.functions.js содержит несколько базовых математических функций для удобного тестирования.
Его тесты находятся в «spec/unit/calculator.function.spec.js». Ниже приведен фрагмент, показывающий простые тесты для функции «добавить». Блок описания объединяет «набор» спецификаций. Каждый блок it представляет собой отдельную спецификацию (или тест). Заголовки спецификаций часто пишутся так, что спецификация должна делать. Блоки описания могут быть вложены друг в друга для иерархической группировки, но блоки (находящиеся на нижнем уровне) не могут. Утверждения выполняются с использованием методов Jasmine, похожих на Fluent, и методов сопоставления. Поскольку функции не имеют состояния, настройка или очистка не требуются. Тесты для других математических функций аналогичны.
Проверка деления на ноль для функции «деления» особенная, поскольку она должна проверять, было ли выдано исключение. Вызов разделения заключен в функцию, чтобы его можно было передать в вызов ожидания.
Функции «максимум» и «минимум» имеют параметризованные тесты с использованием метода forEach класса Array. Это отличный прием для обработки нескольких входных наборов без дублирования кода или объединения спецификаций. Обратите внимание, что заголовки спецификаций также параметризуются. Тесты на «максимум» показаны ниже.
Модульные тесты для классов
Жасмин также может тестировать классы. При тестировании классов более полезными становятся процедуры настройки и очистки. Класс Calculator в модуле lib/calculator.class.js вызывает математические функции и кэширует последний ответ.
Спецификации Jasmine в «spec/unit/calculator.class.spec.js» очень похожи, но теперь вызывают метод beforeEach для создания объекта Calculator перед каждым сценарием. (В Jasmine также есть методы для afterEach, beforeAll и afterAll.) Вспомогательная функция verifyAnswer также упрощает утверждение. Дополнительные тесты показаны ниже.
Модульные тесты с макетами
Имитации помогают сосредоточить модульные тесты на тестируемом модуле. Они необходимы, когда единицы кода зависят от других вызываемых объектов. Например, макеты можно использовать для предоставления фиктивных тестовых значений для REST API вместо вызова реальных конечных точек, чтобы можно было независимо протестировать полученный код.
Стандартные шпионы Жасмин могут издеваться и шпионить, но они не очень эффективны. Например, это не работает, когда члены одного модуля вызывают членов другого или даже когда члены одного модуля вызывают друг друга (если только они не находятся в одном классе). Лучше использовать rewire для обезьяньего исправления (насмешка с помощью подстановки элементов) и sinon для заглушки и шпионажа.
Модуль «lib/weather.js» показывает, как можно выполнять насмешки с зависимостями элементов. Метод «getForecast» класса WeatherCaller вызывает функцию «callForecast», которая предназначена для представления вызова службы для получения прогнозов погоды в реальном времени. Функция «callForecast» возвращает пустой объект, но спецификации «перемонтируют» его для возврата фиктивных тестовых значений, которые могут использоваться классом WeatherCaller. Переподключение будет работать, даже если «callForecast» не экспортируется!
Тесты в «spec/unit/weather.mock.spec.js» исправляют функцию «callForecast» с заглушкой sinon в вызове beforeEach, чтобы каждый тест имел новое количество шпионов. Обратите внимание, что метод погоды импортируется с использованием «rewire» вместо «require», чтобы его можно было исправить с помощью обезьяны. Несмотря на то, что исходная функция возвращает пустой объект, тесты проходят успешно, потому что макет возвращает значение фиктивного теста.
Интеграционные тесты для REST API
Jasmine может выполнять тесты черного ящика точно так же, как и тесты белого ящика. Тестирование вызовов службы REST API является одним из наиболее распространенных тестов на уровне интеграции. Существует множество пакетов запросов REST для Node.js, но frisby специально разработан для тестирования. Frisby даже имеет свои собственные методы ожидания (хотя стандартные ожидания и сопоставления Jasmine все еще могут использоваться).
Для тестов методом черного ящика рекомендуется помещать данные конфигурации для внешних зависимостей в файл конфигурации. Данные конфигурации для вызовов REST API могут быть URL-адресами, именами пользователей и паролями. Никогда не внедряйте данные конфигурации в автоматизацию тестирования. Файлы конфигурации JavaScript очень просты: просто напишите файл JSON и прочитайте его во время настройки теста, используя функцию «require», как и любой модуль. Данные конфигурации будут автоматически проанализированы как объект JavaScript!
Ниже приведен пример теста для вызова REST API Википедии. Он считывает базовый URL-адрес из файла конфигурации и использует его в вызове frisby. Файл конфигурации:
Сквозные тесты веб-интерфейсов
Jasmine также можно использовать для сквозных тестов веб-интерфейса. Одним из самых популярных пакетов для автоматизации веб-браузера является Selenium WebDriver, который использует программные вызовы для взаимодействия с браузером, как реальный пользователь. Selenium выпускает пакет WebDriver для JavaScript для Node.js, но обычно лучше использовать Protractor.
Protractor интегрирует WebDriver с платформами тестирования JavaScript, чтобы упростить его использование. По умолчанию Jasmine является фреймворком по умолчанию для Protractor, но можно использовать Mocha, Cucumber и любой другой фреймворк JavaScript. Одним из лучших преимуществ Protractor по сравнению с WebDriver является то, что Protractor выполняет автоматическое ожидание: явные вызовы для ожидания элементов страницы не требуются. Это замечательная функция, которая устраняет много повторяющегося кода автоматизации. Protractor также предоставляет инструменты для простой настройки Selenium Server и браузеров (включая мобильные браузеры). Несмотря на то, что Protractor предназначен для приложений Angular, тем не менее его можно использовать для внешних интерфейсов, отличных от Angular.
Тесты веб-интерфейса могут быть довольно сложными, поскольку они охватывают много уровней и требуют дополнительной настройки. Взаимодействия с веб-страницами также часто необходимо использовать повторно. Рекомендуется использовать такой шаблон, как объектная модель страницы, для обработки веб-взаимодействий в одном многоразовом слое. Объекты страницы извлекают локаторы и действия WebDriver из тестовых фикстур (например, функции описания/оно), чтобы их можно было легче обновлять при разработке изменений для реальных веб-страниц. (На самом деле, некоторые команды предпочитают совмещать классы объектов страницы с исходным кодом продукта для веб-приложения, чтобы оба обновления обновлялись одновременно.) Модель объектов страницы — отличный способ управлять сложным по своей сути дизайном веб-автоматизации.
В этом руководстве не приводится пользовательский пример для Protractor с Jasmine, поскольку документация по Protractor довольно хороша. Он содержит достойный учебник, инструкции по настройке и настройке, интеграцию с фреймворком и полный справочник. Кроме того, правильная настройка Protractor требует тщательной локальной настройки с работающим сайтом для тестирования. Пожалуйста, обратитесь к официальному документу для получения дополнительной информации. В большинстве примеров в документе используется Jasmine.
Выполнение базового теста
Самый простой способ запустить тесты Jasmine — использовать команду «jasmine».Убедитесь, что вы находитесь в корневом каталоге проекта при запуске тестов. Ниже приведены примеры вызовов.
Параметры выполнения теста также можно задать в файле конфигурации Jasmine.
Расширенное выполнение тестов с помощью Karma
Karma – самопровозглашенный "впечатляющий инструмент для запуска тестов для JavaScript". Его основная ценность заключается в том, что он запускает тесты JavaScript в реальных веб-браузерах (а не только на Node.js), проверяя фактическую совместимость браузера. Фактически, разработчики могут поддерживать работу Karma во время разработки кода, чтобы видеть результаты тестирования в режиме реального времени по мере внесения изменений. Karma интегрируется со многими инструментами тестирования (включая Istanbul для покрытия кода) и фреймворками (включая Jasmine). Сама Karma работает на Node.js и распространяется в виде набора пакетов для разных браузеров и фреймворков. Прочтите эту статью в блоге Google Testing, чтобы узнать, что послужило толчком к разработке Karma, первоначально называвшейся Testacular.
В этом руководстве не приводится собственный пример для Karma с Jasmine, так как для этого требуется локальная установка с правильными пакетами и версиями браузера. Пакеты Karma распространяются через npm. Для Karma с Jasmine требуется основной пакет karma, пакет karma-jasmine и пакет запуска для каждого желаемого браузера (например, karma-chrome-launcher). Есть также много достойных примеров в Интернете здесь, здесь и здесь. Дополнительную информацию см. в официальной документации Karma.
Однако выполнение тестов Jasmine с помощью Karma не лишено трудностей. Одной из проблем является обработка модулей и импорт. ECMAScript 6 (ES6) имеет совершенно новый синтаксис для модулей и импорта, который несовместим с системой модулей CommonJS с require, используемой Node.js. Node.js работает над поддержкой модулей в стиле ES6, но на момент написания этой статьи полная поддержка еще не была доступна. Импорт модулей создает проблемы для Karma, поскольку Karma запускается из Node.js (требуется require), но работает в браузере (который не поддерживает require). Есть несколько обходных путей:
- Используйте RequireJS для загрузки модулей.
- Используйте Browserify, чтобы require работал в браузерах.
- Используйте rollup.js, чтобы объединить все модули в один, чтобы избежать импорта.
- Используйте Angular с TypeScript, который создает и связывает все автоматически.
Угловое тестирование
Angular — очень популярный интерфейсный веб-фреймворк. Это полностью переписанный AngularJS, который рассматривается как альтернатива React. Одним из преимуществ Angular является отличная поддержка тестирования. По умолчанию новые проекты Angular поставляются с конфигурацией для модульного тестирования с помощью Jasmine/Karma и сквозного тестирования с помощью Jasmine/Protractor. Легко интегрировать другие инструменты автоматизации, такие как покрытие кода Istanbul или отчеты HTML. Стандартные проекты Angular, использующие TypeScript, также не страдают от проблемы импорта модулей: импорт компонуется правильно, когда TypeScript компилируется в JavaScript.
Модульные тесты Angular написаны так же, как и любые другие модульные тесты Jasmine, за исключением одного основного отличия: утилит тестирования Angular. Эти дополнительные пакеты создают тестовую среду («TestBed») для внутреннего и независимого тестирования каждой части приложения Angular. Зависимости можно легко заглушить и имитировать с помощью шпионов Jasmine, без необходимости в sinon, поскольку все связывается. NGRX также предоставляет расширенные утилиты для тестирования. Утилиты тестирования Angular поначалу могут показаться слишком сложными, но вместе с Jasmine они упрощают написание юнит-тестов с точностью до лазера.
Еще одна интересная передовая практика для модульных тестов Angular — совмещать их с модулями, которые они охватывают. Для каждого файла *.js/*.ts должен быть файл *.spec.js/*.spec.ts с покрытием описательных/ит-тестов. Это не обычная практика для юнит-тестов, но документация Angular отмечает много преимуществ: тесты легко найти, охват примерно визуален, а обновления с меньшей вероятностью забываются. Автоматически сгенерированная тестовая конфигурация имеет настройки для поиска спецификаций во всем проекте.
Однако сквозные тесты Angular обрабатываются иначе, чем модульные тесты. Поскольку они тестируют приложение как целое, они не используют утилиты тестирования Angular и должны находиться в своем собственном каталоге (обычно с именем «e2e»). Таким образом, сквозные тесты Angular на самом деле ничем не отличаются от любых других тестов веб-интерфейса, использующих Protractor. Jasmine — тестовая среда по умолчанию, но может быть выгодно переключиться на Cucumber.js, чтобы воспользоваться всеми преимуществами BDD.
В этом руководстве не приводятся примеры тестирования Angular, поскольку официальная документация по Angular превосходна. Он содержит учебник, целую страницу по тестированию и живые примеры тестов (ссылки на странице тестирования).
Читайте также: