Статьи

Универсальное модульное тестирование (браузер, Node.js) с помощью Jasmine

Этот пост дает краткое введение в среду модульного тестирования 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-файла в веб-браузере выглядит следующим образом. Все тесты прошли успешно, что объясняет, почему есть только зеленый, а красный нет.

 

Связанное чтение

  1. Жасмин домашняя страница
  2. жасминовый узел на GitHub

 

С http://www.2ality.com/2011/10/jasmine.html