Этот пост дает краткое введение в среду модульного тестирования JavaScript Jasmine . Он имеет преимущество в том, что позволяет запускать тесты как в браузерах, так и в Node.js.
Пример проекта
В качестве примера этот пост использует проект
jasmine-intro на GitHub. Это каталог со следующими файлами:
jasmine-intro/ ├── repeat.js ├── repeat.runner.html └── repeat.spec.js
repeat.js — это код для тестирования:
if (! String.prototype.repeat) { String.prototype.repeat = function (times) { return new Array(times+1).join(this); } }
repeat.spec.js содержит тесты и может быть запущен на Node.js, repeat.runner.html загружает и выполняет repeat.spec.js в веб-браузере.
Написание тестов
Ожидание используется для проверки одного утверждения, например, «если я вызову этот метод таким образом, то результат должен быть X». Вы пишете ожидание, вызывая функцию wait () со значением, которое вы хотите проверить. Возвращенный объект имеет
сопоставления , методы, которые позволяют вам проверить значение. Смотрите ниже список часто используемых совпадений. Пример:
expect("abc".repeat(2)).toEqual("abcabc");
Спецификация — это последовательность ожиданий, которая тестирует одну функциональность. Вы пишете спецификацию через функцию
it(description, function)
где description — текстовая строка, описывающая тестируемую функциональность, а функция выполняет ожидания. Пример:
it("repeats strings", function() { expect("abc".repeat(2)).toEqual("abcabc"); expect("abc".repeat(0)).toEqual(""); });
Набор групп связанных спецификаций. Вы не можете написать отдельные спецификации. Спецификация создается с помощью функции
describe(description, function)
где description — текстовая строка, описывающая сущность пакета, а функция запускает спецификации. Пример:
describe("repeat", function() { it("repeats strings", function() { expect("abc".repeat(2)).toEqual("abcabc"); expect("abc".repeat(0)).toEqual(""); }); });
Matchers
Следующие соответствия часто используются в Жасмин — цитирование
документации Жасмин :
ожидать (х) .toEqual (у); сравнивает объекты или примитивы x и y и передает их, если они эквивалентны ожидать (х) .toBe (у); сравнивает объекты или примитивы x и y и передает их, если они являются одним и тем же объектом ожидать, (х) .toMatch (рисунок); сравнивает x со строкой или шаблоном регулярного выражения и передает, если они совпадают ожидать (х) .toBeDefined (); проходит, если х не является неопределенным ожидать (х) .toBeUndefined (); проходит, если х не определено ожидать (х) .toBeNull (); проходит, если х ноль ожидать (х) .toBeTruthy (); проходит, если х оценивается как истина ожидать (х) .toBeFalsy (); проходит, если х оценивается как ложное ожидать (х) .toContain (у); проходит, если массив или строка x содержит y ожидать (х) .toBeLessThan (у); проходит, если х меньше, чем у ожидать (х) .toBeGreaterThan (у); проходит, если х больше, чем у ожидать (п) .toThrow (е); проходит, если функция fn выдает исключение e при выполнении
Вы отрицаете соответствие, добавляя .not:
expect(x).not.toEqual(y);
Запуск тестов на Node.js
Чтобы запустить Jasmine на Node.js, нам нужно только установить модуль jasmine-node через
npm :
sudo npm install -g jasmine-node
Приятной особенностью jasmine-node является то, что он также устанавливает инструмент командной строки для запуска тестов. Учитывая следующее содержание repeat.spec.js.
require("./repeat.js"); describe("repeat", function() { it("repeats strings", function() { expect("abc".repeat(2)).toEqual("abcabc"); expect("abc".repeat(0)).toEqual(""); }); });
Теперь вы можете выполнить вышеуказанные тесты через
$ jasmine-node repeat.spec.js Started . Finished in 0.003 seconds 1 test, 1 assertion, 0 failures
Если вызывается без аргумента, команда jasmine-node ищет текущий каталог и все содержащиеся в нем каталоги для файлов, заканчивающихся на «.spec.js», и запускает их.
Запуск тестов в браузере
Следующий HTML-код запускает файл repeat.spec.js в браузере.
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Jasmine Spec Runner: repeat</title> <link rel="shortcut icon" type="image/png" href="/Users/rauschma/local/jasmine/images/jasmine_favicon.png"> <link href="/Users/rauschma/local/jasmine/lib/jasmine-core/jasmine.css" rel="stylesheet"/> <!-- Jasmine files --> <script type="text/javascript" src="/Users/rauschma/local/jasmine/lib/jasmine-core/jasmine.js"></script> <script type="text/javascript" src="/Users/rauschma/local/jasmine/src/html/TrivialReporter.js"></script> <!-- CUSTOMIZE: The code to be tested and the tests --> <script type="text/javascript" src="repeat.js"></script> <script> function require() { // do nothing, allows repeat.spec.js to require a node module } </script> <script type="text/javascript" src="repeat.spec.js"></script> <script type="text/javascript"> (function() { var jasmineEnv = jasmine.getEnv(); ... window.onload = function() { ... jasmineEnv.execute(); }; })(); </script> </head> <body> </body> </html>
Помимо путей, начинающихся с
/Users/rauschma/local/jasmine/
только строки после
<!-- CUSTOMIZE: ... -->
необходимо изменить для данного файла spec.js. Открытие HTML-файла в веб-браузере выглядит следующим образом. Все тесты прошли успешно, что объясняет, почему есть только зеленый, а красный нет.
Связанное чтение