Пример тестирования классов на CoffeeScript с помощью Spec.
Устанавливаем Node.js (это JavaScript на сервере) - http://nodejs.org/#download (Windows Installer, Macintosh Installer, Source Code)
После установки появляется менеджер пакетов npm
Устанавливаем модуль компилирования CoffeeScript coffee-script
:
npm install -g coffee-script
Устанавливаем модуль тестирования jasmine
:
npm install jasmine-node -g
Создадим папки lib
и spec
- в первой будут классы CoffeeScript
во второй спецификиция класса.
Для тестирования запускается команда jasmin-node
:
jasmine-node --coffee .
Будут найдены все файлы, и если они содержат спецификации - тогда они будут выполнены.
Параметр --coffee
- указыает, что файлы будут в формате CoffeeScript - и их надо
будет компилировать (это будет выполнено "на лету"), далее идёт описание папки
где надо смотреть спецификации - мы указали "." - то есть с текущей папки.
Создадим в папке spec
файл ball_spec.coffee
:
describe "Тестирование Объекта", ->
it "тест истины", ->
expect(true).toBeTruthy()
Теперь находясь в папке spec
выполним тестирование:
jasmine-node --coffee .
В консоли увидим:
...>jasmine-node --coffee .
.
Finished in 0.028 seconds
1 test, 1 assertion, 0 failures
Теперь изменим условие true
на false
:
describe "Тестирование Объекта", ->
it "тест истины", ->
expect(false).toBeTruthy()
И опять запустим тест, и на этот раз увидим в консоли:
...>jasmine-node --coffee .
F
Failures:
1) тест истины
Message:
Expected false to be truthy.
...
Finished in 0.277 seconds
1 test, 1 assertion, 1 failure
Отметим, что для win машины - автоматически работает подсветка консоли и русский (utf-8) шрифт.
Меняем на:
describe "Тестирование Объекта", ->
it "тест истины", ->
expect(false).toBeFalsy()
И теперь тест проходит.
Теперь подробнее.
Название файла где описаны спецификации должно оканчиваться на _spec
,
в нашем примере это - ball_spec.coffee
. Иначе тест не будет найден.
В файле есть "блоки" - describe
и it
.
Первый describe
- это просто группировочный.
Второй it
- содержит какой либо тест.
В нашем примере это было:
expect(true).toBeTruthy()
Здесь:
expect(...).toBeTruthy()
Это конструкция модуля тестирования Jasmine. Она проверяет
что содержимое expect() - ожидаемо равно некому условию,
в нашем примере - toBeTruthy()
- то есть булевому значению "истина".
toBeTruthy
- называется "матчер" (matcher), и есть целый набор для
выполнения тестирования:
// The 'toBe' matcher compares with ===
.toBe(...)
.not.toBe(true)
.toEqual(...)
.toMatch(/bar/)
.toBeDefined()
.not.toBeDefined()
.toBeUndefined()
.toBeNull()
.toBeTruthy()
.toBeFalsy()
.toContain(...)
.toBeLessThan(...)
.toBeGreaterThan(...)
Матчеры можно посмотреть здесь:
В CoffeeScript, мы заменям формат JavaScript:
describe("A spec", function() {
it("test", function() {
expect(true).toBeTruthy();
});
});
На CoffeeScript:
describe "A spec", ->
it "test", ->
expect(true).toBeTruthy()
При этом кода, чисто математически - становится меньше на 30%, при этом не теряя функциональности -- соответственно повышается читаемость.
Можно стартовать в режиме ожидания изменения файлов - и по факту изменения файлов в папке - прогонять тестирование.
Например для win машины, находясь в папке spec
:
start jasmine-node --coffee . --autotest
Консоль будет открыта в новом окне - она прогонит первый тест, и будет ожидать изменения файлов.
Можем проверить - изменить файл spec/ball_spec.coffee
- сохранить
и в консоли должен будет запуститься заново тест.
Автотестирование удобно когда идёт разработа "тест-в-начале" - когда пишется спецификация на функцию/класс - и после этого происходит реализация - то тех пор пока тест не заработает.
При этом, так как при добавлении каждого нового функционала будут прогоняться все прошлые тесты - то можно гарантировать, что работа класса не нарушается после добавления новых функций.
[to be continued]