Сегодня я решил написать о jsTestDriver. jsTestDriver это фреймворк для написания модульных тестов на JavaScript.

Начнем с простого – с мотивации. Многие программисты скажут: ”Зачем мне вообще писать эти тесты?” Причем стоит признать, что зачастую они так не потому, что не знают зачем, а потому что им лень тратить время на подобные действия.

Действительно, писать тесты, которые покрывают все возможные случаи для каждого метода – это длительная и кропотливая работа. Но, как писал Мартин Фаулер, лучше пусть у меня будут тесты, которые не покрывают весь функционал, чем вообще не будет тестов. Давайте же выясним, почему он так говорил? Зачем нам писать тесты? Ответ прост: для того чтоб находить ошибки (логично да?). А если конкретнее, для того чтоб узнавать, что что-то поломалось, как только это произошло. Во-первых, тесты необходимы при рефакторинге: на данный момент в большинстве современных IDE есть специальные инструменты для рефакторинга, они сводят количество ошибок к минимуму, но тесты все же дают дополнительные гарантии. Во-вторых, регрессия: если структура приложения сложная, и связанность между компонентами высокая, могут возникать ситуации, когда, исправляя один баг, мы создаем другой. В таких ситуациях тесты помогают вовремя выявить связанность и не допустить появления нового бага. Главное не забывать запускать тесты после каждого изменения. Для этого запуск тестов должен быть простым и быстрым, а результаты понятными. Как результат мы тратим меньше времени на багфиксы, что и является нашей целью.

Что же касается написания тестов, как уже было замечено ранее, не стоит пытаться сразу написать тесты на все случаи жизни, достаточно проверить основные варианты. Далее, по мере возникновения неполадок, следует добавлять тесты, для проверки конкретных багов. Во-первых, это повышает мотивацию к написанию тестов, поскольку мы уже не просто пишем тесты для себя, а проверяем конкретный баг. Во-вторых, мы тем самым препятствуем регрессии, поскольку сразу же проверяем, что после изменения уже исправленный баг не возник снова. Чем больше написано тестов, тем соответственно больше багов удается предотвратить. При этом не стоит забывать, что написание тестов тоже требует времени. Соответственно, если это время будет больше, чем то, которое потребовалось бы на поиск и исправление предотвращенных неполадок, то написание тестов становиться невыгодным.

С целью написания автоматических тестов было создано множество фреймворков. Одни из наиболее известных – фреймворки семейства Unit. Эти фреймворки построены на основе дизайна, впервые примененного Кентом Беком для создания sUnit тест-фреймворка для Smalltalk. Среди них широко известные JUnit, CppUnit, NUnit и т.д. Основным принципом является то, что каждый тест это некоторый класс, содержащий методы для подготовки к тестированию(вроде конструктора), произвольного количества тестов и завершения тесткейса(соответственно деструктор). Кроме того, принята конвенция, что все методы тестов начинаются со слова “test”(в некоторых фреймворках с большой буквы). Соответственно, все такие методы запускаются при тестировании, с помощью reflection(или его аналогов, в языках, где он отсутствует).

jsTestDriver во многом похож на фреймворки семейства xUnit, а отличается по сути, тем, что в нем нет аналогов конструкторов-деструкторов. Страница jsTestDriver находится на гугл коде http://code.google.com/p/js-test-driver/. Для того чтоб использовать jsTestDriverв вашем проекте, необходимо скачать плагин к используемой Вами IDE(например, для IntelliJIDEA его можно скачать тут) и установить его стандартным образом. Писать тесты на jsTestDriver очень просто, нужно унаследовать класс TestCase, передавая конструктору, как параметр строку(название теста) и доопределить методы через prototype. Либо же инициализировать TestCase, передавая ему, как первый параметр строку, а вторым массив методов-тестов. Далее в тестах мы проверяем утверждения стандартными методами(так же как и в xUnit). Если какая-то из проверок не пройдена, в консоль выводится сообщение об ошибке с указанием причины и места ее возникновения. Есть так же возможно указывать кастомные сообщения об ошибке.

Основные функции проверки с сигнатурами(полный список можно посмотреть здесь):

assert([msg], actual), assertTrue([msg], actual) – выводят сообщение о провале теста в случаи, если actual ложно,

assertFalse([msg], actual) – выводит сообщение о провале теста в случаи, если actual истинно,

assertEquals([msg], expected, actual) – выводит сообщение о провале теста в случаи, если actual не равно expected,

assertNotEquals([msg], expected, actual) – выводит сообщение о провале теста в случаи, если actual равно expected.

В тестах так же можно выводить отладочную информацию в консоль с помощью jstestdriver.console.log.



Когда тесты готовы, необходимо добавить их и тестируемые js-файлы в предварительно созданный файл конфигурации jsTestDriver.conf. Потом запустить браузер, для которого должна осуществляться проверка. После этого выберете конфигурацию для компиляции/выполненияjsTestDriver. Запустите jsTestDriverсервер, он отобразит ссылку (что-то вроде http://localhost:9876/capture) ее необходимо открыть в браузере в котором предполагается производить тестирование. Выберите из запущенных браузеров с открытой ссылкой на jsTestDriver сервер тот, в котором будет проходить тестирование. Затем запустите выполнение, в консоли будут выведены ошибки, найденные при тестировании, если ошибок нет, будет выведено, что тесты прошли без ошибок.
0

Комментарии

Для того, чтоб оставлять комментарии или зарегистрируйтесь.