Karma — тестируем javascript в консоли

в 4:22, , рубрики: AngularJS, javascript, tdd, метки: ,

Здравствуйте. Признаюсь честно, я пишу тесты редко. Т.е хотел бы чаще, но все как-то не получается. Вроде и руководство в принципе не против даже, но все равно находятся задачи посрочнее и поважнее. Тем не менее на днях заглянув в redmine обнаружил что задач практически нет (точнее они были, но требовали сперва дождаться бэкэнда).
Что ж, самое время вспомнить про тесты (конечно нужно было раньше о них думать, но лучше поздно чем никогда).
Вообще я до этого уже пробовал писать тесты, в том числе и на бэкэнде, а конкретно django. Я еще тогда подумал что было бы здорово запускать тесты из консоли а не в окне браузера. Ну а поскольку с недавнего времени я активно слежу за развитием angular, то почему бы не посмотреть как это сделано у них. Тем более как-то краем глаза я зацепил момент, что там тесты как раз запускаются в консоли. Плюс к тому же с нуля разбираться в премудростях тестирования не хотелось и я решил взять какой нибудь готовый проект с тестами, посмотреть как оно сделано, и погонять собственно тесты на нем. Мой выбор пал на angular-ui, а точнее на один из его модулей ui-utils.

Скачиваем, заходим в корень видим папку test а в ней файл karma.conf.js
Да и в самом ридми написано, что тесты запускаются так karma start —browsers ….
Гуглим karmajs и находим то что нам нужно karma-runner.github.io/0.8/index.html
Утилита для тестирования. Итак что она может?

  • Запускать тесты из консоли
  • Автоматически прогонять все тесты при каждом сохранении!!!
  • Возможность писать тесты на множестве фреймворков, таких как jasmine, qunit и др.
  • Прогонять тесты сразу на нескольких браузерах. (в том числе виртуальных, например fantomjs).

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

Как я уже говорил я решил сначала попробовать на готовом проекте. В общем мои действия:

cd ui-utils
sudo apt-get install nodejs # на самом деле у меня уже давно установлена
sudo npm install karma -g # ставим глобально, но вприципе можно и локально
sudo npm install bower # нужен для того чтобы установить необходимые пакеты для ui-utils
npm install 
bower install

Вот собственно и все.
Теперь запускаем в терминале.

karma start --brower=Chrome test/karma.conf.js --auto-watch

После этого у нас запустится браузер Chrome, в котором будет надпись:…
Переходим обратно в терминал, и видим что какие-то тесты запустились, и все они прошли.
Теперь заходим в любой из файлов тестов, они находятся по адресу modules/modulename/test/testnameSpec.js
В какую либо из секций it('...', function() {……
и дописываем

expect(2).toBe(3); # здесь в тестах используется jasmin, но можно использовать и другие фреймворки

сохраняем, смотрим в консоль и видим что-то вроде этого.

.............................................................
Chrome 28.0 (Linux) uiMask initialization should not not happen if the mask is undefined or invalid FAILED
	Expected 2 to be 3.
	Error: Expected 2 to be 3.
	    at null.<anonymous> (/home/mn/Documents/www/temp/ui-utils/modules/mask/test/maskSpec.js:25:17)
..........................................................................
Chrome 28.0 (Linux): Executed 136 of 136 (1 FAILED) (1.016 secs / 0.642 secs)

Наш тест обвалился.

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

karma run

Т.е сперва нужно запустить

karma start test/karma.konf.js —no-auto-wath 

и затем, в другом терминале запускать

karma run

Таким образом тесты будут запускаться вручную.
Конечно же я описал далеко не все возможности karma. Скорее этим постом я хотел привлечь ваше внимание к этой интересной утилите. Так что просто посетите сайт и посмотрите все сами.

P.S karma конечно же можно использовать не только для тестирования angular, но в целом и для любого другого клиентского кода на js. На текущем проекте мы не используем angular, но тесты на karma писать очень удобно.

P.S раньше эта утилита называлась testacular

Автор: kromxr

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js