На практике очень редко пишут собственные решения для тестирования javascript-кода. Чаще всего используют готовые библиотеки/фреймворки для тестирования, в которых обычно реализован весь необходимый для тестирования функционал.
Наиболее популярные библиотеки для тестирования JavaScript-кода:
Рассмотрим работу с библиотекой 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 ) можно указать время, по истечении которого асинхронный тест будет признан провальным.