Unit, Integration and Functional Testing

В среде тестирования JavaScript зачастую бывает сложно с ориентироваться в точном понимание терминов тестирования, таких как unit tests, integration tests, functional tests, E2E tests, browser tests… Кто за что отвечает и какой из них использовать, зачем и когда ?

Unit Testing

Unit tests или еще модульное тестирование, является практикой тестирования небольших фрагментов кода, изолированных функций. Если ваши тесты используют сторонние ресурсы, например сетевые ресурсы или обращение к базе данных, то это не относится к данному классу тестов.

Модульные тесты должны быть просты в написании. Например, написанную ранее функцию разработчик может проверить на корректность выполнения логики задав входные параметры и проверив выходные. На практике стоит не забывать, что хорошо написанный код удобно сопровождать тестами.

Модульные тесты также отлично подходят для предотвращения регрессии — ошибок, которые происходят неоднократно. Вы так же можете использовать интеграционные или функциональные тесты для регрессионного тестирования, но модульные в данном случае гораздо полезны, потому что они обладают спецификой контекста и быстрее локализуют места ошибок.

Когда же следует использовать модульное тестирование ? В идеале на протяжении всего времени работы над проектом. Хороший набор модульных тестов позволяет не только предотвратить возникновение ошибок, но и улучшить дизайн кода  и в дальнейшем помочь в реорганизации («рефакторинге») кода.

Одни из популярных инструментов являются Mocha и Jasmine test framework.

Integration Testing

Как следует из названия, в интеграционном тестирование идея заключается в том, чтобы проверить совместность работы компонентов системы. Интеграционные тесты аналогичны модульным тестам, но есть одна большая разница: если модульные тесты изолированы о знании окружающих компонентов, то интеграционные — нет. Например, модульный тест не будет делать реальный запрос к API сервера, в свою очередь интеграционный тест будет.

В рамках интеграционного тестирования вам нужно убедиться, что отдельные компонента JS (или JS API) корректно между собой взаимодействуют.

Интеграционные тесты зачастую медленнее, чем модульные из-за дополнительной сложности. Так же может потребоваться настройка окружения, например развертывание API сервера с подготовленной миграции данных. Так что за частую стоит сбалансированно отнестись к выделению времени на написание модульных и интеграционных тестов.

Для написания интеграционных тестов (в рамках JavaScript) обычно используются те же инструменты, что и для модульных.

Functional Testing

Функциональные тесты иногда называют E2E тестами или тестированием браузера.

Функциональное тестирование определяется как тестирование полной функциональности приложения. На практике это означает, что имеется-инструмент интеграции с браузером, с помощью которого можно производить взаимодействия с элементами страницы.

Вы можете использовать модульные тесты для проверки изолированной логики функций или интеграционные тесты, для проверки взаимодействия компонентов. Функциональные тесты строятся уровнем выше. При наличии сотни модульных тестов, функциональных обычно в 10 раз меньше. Это связанно со сложностью их написания и долгим временем их выполнения, т.к. данные тесты имитируют реальное поведение системы.

В связи со всем этим не надо писать функциональные тесты очень мелко. Не стоит писать один функциональный тест, что проверить корректность работы одной функции в коде, для этого есть модульные тесты. Проверьте например, успешную регистрацию пользователя в системе.

Наиболее распространенным инструментом используемым для функционального тестирование является Selenium. Запуск Selenium обычно осуществляется с помощью Selenium WebDriver или Protractor. Если вам нет необходимость использовать реальный браузер, то можно воспользоваться PhantomJS или CasperJS.

В заключение

Модульное тестирование является основной JavaScript тестов. Данные тесты просты в написание и поддержке, и обеспечивают путь к уменьшению дефектов приложения. Интеграционные и функциональные тесты используются в тех областях, где модульные тесты не подходят.

 

Полезные ссылки

Unit Test with Jasmine 2.0 & RequireJS

Небольшой пример тестирования, с помощью Jasmine 2.0 и RequireJS

Рассматриваются,

  • сравнения
  • spyOn и вызовы

Исходный код на Plunker

 

Travis CI — использование с проектами на Github

Travis CI это серверная платформа непрерывной интеграции, которая является бесплатной для всех проектов, с открытым кодом, размещенных на Github. С помощью всего лишь одного файла .travis.yml (содержащим  информацию о проекте), возможно активировать автоматические сборки.

В данном примере Travis CI использует следующие инструменты:

Интерфейс Travis CI

Давайте разделим главную страницу Travic CI, на логические блоки.

travis-interface

  1. Боковая панель: отображает, список проектов, у которых в данный момент проходит автоматизированная сборка. В каждом процессе отображается название проекта, продолжительность и порядковый номер сборки.
  2. Build in Progress [желтый]: указывает, что проект в процессе CI.
  3. Build failed [красный]: указывает, о не успешном завершении процесса.
  4. Build passed [зеленый]: указывает, о успешном завершении процесса.
  5. Название проекта: Заголовок в формате имя пользователя / хранилища. Символ Octocat и ссылка на Github, репозиторий, содержащий  исходный код.
  6. Информация о сборке: отображается информация по текущей сборке, история сборок, сборки от pull request.
  7. Build Matrix: отображает информацию о каждой из задач.

Статус сборки

К вашему проекту возможно подключить динамический индикатор статуса. Собрать URL изображение можно по такому шаблону — http://travis-ci.org/[username]/[repository-name].png

travis-build

Ресурсы Travis CI

Вот некоторые ресурсы для понимания концепции непрерывной интеграции, а также обучения и интеграции Travis CI в ваши Github проекты:

Самый быстрый и простой способ узнать различные конфигурации для .travis.yml файл — обратить внимание на популярные проекты, которые уже используют Travis CI. Вот некоторые из них:

  1. Ruby on Rails (Ruby)
  2. BackboneJS (JavaScript)
  3. Composer (PHP)
  4. Flask (Python)

Надеюсь, этот небольшой обзор дал вам краткое понимание, как можно легко и быстро интегрировать Travis CI в ваши Github проекты!