Автоматическое тестирование является неотъемлемой частью жизненного цикла приложения (см. Непрерывная интеграция ). В веб-разработке мы обычно тестируем: Back-end (* Unit-тесты), Front-end (валидаторы HTML / CSS, JSLint / JSHint, CSSLint, YSlow и т. Д.) И UI (функциональное тестирование). Модульное тестирование (Back-end, Front-end) — это проверка соответствия всех компонентов приложения требованиям технического проекта. Каждый юнит-тест имитирует среду приложения, в которой выполняется. Функциональные тесты должны определить, нет ли недостатков у приложения как целой экосистемы. Они работают на копии реальной среды приложения и показывают, все ли в порядке с точки зрения пользователя. Вы можете увидеть это как автоматизацию QA-инженера, где это возможно. Для функционального тестирования широко используются такие фреймворки, как Selenium ,Ветряная мельница , Twill , BusterJS . Хотя, если вы используете qUnit для внешнего модульного тестирования, вам может понравиться идея использовать тот же инструмент для функционального тестирования . jQuery предоставляет невероятный API для манипулирования DOM. Это может быть замечательный инструмент для моделирования поведения пользователей и проверки реакции DOM.
Благодаря посту Мишеля Готта я нашел решение .
конфигурация
Вы просто передаете UiTester список пользовательских интерфейсов, которые вы хотите протестировать, в файле генератора отчетов qUnit:
<div id="playground"></div> <h1 id="qunit-header">QUnit example</h1> <h2 id="qunit-banner"></h2> <div id="qunit-testrunner-toolbar"></div> <h2 id="qunit-userAgent"></h2> <ol id="qunit-tests"></ol> <div id="qunit-fixture">test markup, will be hidden</div> <script type="text/javascript"> (function( $, window, undefined) { $(window.document).ready(function(){ UiTester.init( $, { testsuites : [ {suit : "example1", url: "ui-form-example.html"}, {suit : "example2", url: "ui-widget-example.html"} ], wwwRoot : "./../" }); }); }( jQuery, window )); </script>
Таким образом, мы предполагаем, что у нас есть 2 страницы (здесь только 2 HTML-файла), относящиеся к примерам тестов examples1 и example2 соответственно. Это могут быть любые URL-адреса одного домена с инструментом тестирования. Таким образом, UiTester будет выполнять итерацию по массиву testsuites, загружая определенный URL-адрес в iframe и выполняя тестовый набор, соответствующий значению набора.
тесты
Теперь посмотрим, как выглядят тесты:
var TestSuit = function( $, proceed) { return { example1: function() { // qUnit tests proceed(); }, example2: function() { // qUnit tests proceed(); } } }
Тесты, помещенные в область действия функции, которая представляет реальный экземпляр jQuery (каждый пользовательский интерфейс имеет собственный) и функцию продолжения, которая указывает, где завершены все тесты масти. В этом конкретном примере тесты предполагаются синхронными, и процесс всегда идет в конце костюма. Однако это не будет работать с асинхронными тестами. Конец функции будет достигнут до того, как тесты действительно будут выполнены. Таким образом, вы должны вызывать продолжить () в последнем асинхронном тестовом обратном вызове рядом с start ().
var TestSuit = function( $, proceed) { return { example: function() { // qUnit tests asyncTest( "The last async test", 1, function() { window.setTimeout(function() { ok( true, "All is fine" ); start(); proceed(); }, 500); }); } } }
Помощники утверждения
При написании тестов для DOM я обнаружил, что мне нужен помощник, чтобы сделать поток утверждений более читабельным:
test( "Test DOM", function() { testNodes([ {node: "selector", assert: "exists", msg: "Selector found" }, {node: "selector", assert: "visible", msg: "Selector visible" }, {node: "selector", assert: "checked", msg: "Selector checked" } ]); });
Итак, ui-tester.js содержит exteQUnit с набором доступных помощников утверждений, расширяющих стандартный набор qUnit. В настоящее время единственным помощником является testNodes, но вы можете легко расширить его в любое время.
Теперь мы можем запустить генератор отчетов (/tests-js/index.html) и проверить, как проходит тест.
В командной строке
Хотите запустить тесты на консоли? Это можно сделать, например, с помощью phantomjs :
phantomjs run-qunit.js http://project.my/tests-js/index.html 'waitFor()' finished in 1300ms. Tests completed in 1167 milliseconds. 25 tests of 25 passed, 0 failed.
Только не забудьте изменить значение по умолчанию Max Timeout в run-qunit.js.