Основы тестирования 2

Тестирование Javascript с помощью QUnit

На практике очень редко пишут собственные решения для тестирования javascript-кода. Чаще всего используют готовые библиотеки/фреймворки для тестирования, в которых обычно реализован весь необходимый для тестирования функционал.

Наиболее популярные библиотеки для тестирования JavaScript-кода:

Рассмотрим работу с библиотекой QUnit.

Установка QUnit

На официальном сайте проекта предлагаются различные варианты установки библиотеки, в том числе с использованием различных менеджеров пакетов. Воспользуемся самым простым способом: скачаем необходимые css и js файлы, а также создадим страничку tests.html для отображения результатов тестов примерно следующего вида:

<!DOCTYPE html>
<html>
    <head>
        <!-- файлы библиотеки //-->
        <link rel="stylesheet" href="qunit.css" />
        <script src="qunit.js"></script>

        <!-- код для тестирования //-->
        <script src="script.js"></script>

        <!-- тесты //-->
        <script src="tests.js"></script>
    </head>
    <body>
        <!-- div для отображения тестов //-->
        <div id="qunit"></div>
    </body>
</html>

Все готово для тестирования.

Написание тестов

При написании тестов используются следующие методы объекта QUnit:

Структура утверждений

Утверждение - это выражение, которое прогнозирует возвращаемый результат при выполнении вашего кода. Если прогноз неверный, то утверждение имеет значение false, что позволяет сделать выводы о наличии ошибок.

QUnit использует следующие методы-утверждения:

Асинхронный тест

Иногда бывает неоходимо тестирование асинхронного кода. Например, скрипт запрашивает данные с сервера, как-то их обрабатывает и это поведение необходимо проверить. В этом случае на время запуска асинхронной функции необходимо приоставить работу теста, и возобновить в тот момент, когда асинхронная функция закончила сою работу. Для этих целей QUnit использует утверждение acync, которое возвращает callback-функцию, которую нужно выполнить для возобновления работы тестов.

QUnit.test( "async functions", function( assert ) {
  assert.expect( 2 );

  var ready1 = assert.async();
  var ready2 = assert.async();
  setTimeout(function() {
    assert.ok( true, "async function 1" );
    ready1();
  }, 500 );
  setTimeout(function() {
    assert.ok( true, "async function 2" );
    ready2();
  }, 150);
});

Кроме того, с помощью timeout( duration ) можно указать время, по истечении которого асинхронный тест будет признан провальным.