Я'пытаюсь включить некоторое тестирование JavaScript в мой автоматизированный процесс сборки. В настоящее время JSUnit хорошо работает с JUnit, но он кажется заброшенным и не имеет хорошей поддержки AJAX, отладки и таймаутов.
Удалось ли кому-нибудь автоматизировать (с помощью ANT) библиотеку модульного тестирования, такую как YUI test, JQuery's QUnit или jQUnit (http://code.google.com/p/jqunit/)?
Примечание: я использую собственную библиотеку AJAX, поэтому проблема с Dojo's DOH в том, что она требует, чтобы вы использовали их собственные вызовы функций AJAX и обработчики событий для работы с любым модульным тестированием AJAX.
Я'м собираюсь начать делать на JavaScript ТДД на новый проект, я работаю на. Мой текущий план заключается в использовании помощью QUnit, чтобы сделать модульного тестирования. При разработке тестов можно запустить, просто обновив страницу тест в браузере.
Для непрерывной интеграции (и обеспечение выполнения тестов во всех браузерах), я буду использовать Селена для автоматической загрузки теста в каждом браузере, и прочитать результат. Эти тесты будут выполняться на каждом checkin для управления исходным кодом.
Я также собираюсь использовать JSCoverage, чтобы сделать анализ покрытия кода тестами. Это также будет автоматизирован с селеном.
Я'м в середине настройке. Я'будете обновлять этот ответ с более точные данные после того, как я настройки выбил.
Инструменты тестирования:
Существует множество фреймворков для модульного тестирования javascript (jsUnit, scriptaculous, ...), но jsUnit - единственный из известных мне, который можно использовать с автоматизированной сборкой.
Если вы делаете 'истинное' модульное тестирование, вам не нужна поддержка AJAX. Например, если вы используете RPC ajax фреймворк, такой как DWR, вы можете легко написать mock-функцию:
function mockFunction(someArg, callback) { var result = ...; // некоторые процедуры setTimeout(И да, JsUnit действительно обрабатывает таймауты : [Моделирование времени в тестах jsUnit][1]
function() { callback(result); }, 300 // некоторые поддельные задержки
); }
Im большой поклонник Яш-тест-драйвер
Он хорошо работает в среде CI и способен фиксировать фактическое браузеры для кросс-браузерное тестирование.
Я просто в <а href="и http://skaug.no/ingvald/2010/10/javascript-unit-testing.html">у Хадсон КИ для запуска JasmineBDD</а> (без головы), по крайней мере на чистом JavaScript, модульное тестирование.
(Гудзон Java с помощью консоли, запущенной Envjs, работает JasmineBDD.)
Я не'т получил его, чтобы играть с большой библиотекой, хотя, как прототип.
Я недавно читал статью Бруно, используя JsUnit и создание JsMock рамки на вершине, что... очень интересно. Я'м мышления, используя свою работу, чтобы начать тестирование мой код JavaScript.
Макет JavaScript или как блок проверить JavaScript вне среды браузера
Я согласен, что jsunit вроде умирает на корню. Мы только что закончили, заменив его на тест Юи.
Похоже на пример с помощью помощью QUnit, мы проводим тесты с использованием Selenium. Мы проводим этот тест независимо от других наших тестов Selenium просто потому, что он не имеет зависимостей, что нормальной регрессии тесты пользовательского интерфейса (например, развертывание приложения на сервере).
Для начала, у нас есть базовый файл JavaScript, который входит в состав всех наших тестовых файлов в формате HTML. Это ручки настройки Юи экземпляр, тест бегун, Юи.Тест.Объект Suite, а также Тест.Случае. Она имеет методы, которые могут быть доступны через селен для запуска тестов, проверьте, чтобы увидеть, если тестов еще работает (результаты будут доступны только после того, как он'ы сделали) и получить результаты теста (мы выбрали формат JSON)
var yui_instance; //the YUI instance
var runner; //The YAHOO.Test.Runner
var Assert; //an instance of YAHOO.Test.Assert to save coding
var testSuite; //The YAHOO.Test.Suite that will get run.
/**
* Sets the required value for the name property on the given template, creates
* and returns a new YUI Test.Case object.
*
* @param template the template object containing all of the tests
*/
function setupTestCase(template) {
template.name = "jsTestCase";
var test_case = new yui_instance.Test.Case(template);
return test_case;
}
/**
* Sets up the test suite with a single test case using the given
* template.
*
* @param template the template object containing all of the tests
*/
function setupTestSuite(template) {
var test_case = setupTestCase(template);
testSuite = new yui_instance.Test.Suite("Bond JS Test Suite");
testSuite.add(test_case);
}
/**
* Runs the YAHOO.Test.Suite
*/
function runTestSuite() {
runner = yui_instance.Test.Runner;
Assert = yui_instance.Assert;
runner.clear();
runner.add(testSuite);
runner.run();
}
/**
* Used to see if the YAHOO.Test.Runner is still running. The
* test results are not available until it is done running.
*/
function isRunning() {
return runner.isRunning();
}
/**
* Gets the results from the YAHOO.Test.Runner
*/
function getTestResults() {
return runner.getResults(yui_instance.Test.Format.JSON);
}
Что касается Селена стороне дела, мы использовали серийный тест. Мы запускать тесты в IE и Firefox в данных метод анализа результатов тестирования в список объектов, массивов, каждый массив, содержащий браузер название, файл теста фамилия, имя test, результат (пройти, не игнорировать) и сообщение.
Сам тест просто подтверждает результат теста. Если оно не равно, чтобы "сдать" тогда это тест не проходит с сообщением, что вернулся из результата теста Юи.
@Parameters
public static List<Object[]> data() throws Exception {
yui_test_codebase = "file:///c://myapppath/yui/tests";
List<Object[]> testResults = new ArrayList<Object[]>();
pageNames = new ArrayList<String>();
pageNames.add("yuiTest1.html");
pageNames.add("yuiTest2.html");
testResults.addAll(runJSTestsInBrowser(IE_NOPROXY));
testResults.addAll(runJSTestsInBrowser(FIREFOX));
return testResults;
}
/**
* Creates a selenium instance for the given browser, and runs each
* YUI Test page.
*
* @param aBrowser
* @return
*/
private static List<Object[]> runJSTestsInBrowser(Browser aBrowser) {
String yui_test_codebase = "file:///c://myapppath/yui/tests/";
String browser_bot = "this.browserbot.getCurrentWindow()"
List<Object[]> testResults = new ArrayList<Object[]>();
selenium = new DefaultSelenium(APPLICATION_SERVER, REMOTE_CONTROL_PORT, aBrowser.getCommand(), yui_test_codebase);
try {
selenium.start();
/*
* Run the test here
*/
for (String page_name : pageNames) {
selenium.open(yui_test_codebase + page_name);
//Wait for the YAHOO instance to be available
selenium.waitForCondition(browser_bot + ".yui_instance != undefined", "10000");
selenium.getEval("dom=runYUITestSuite(" + browser_bot + ")");
//Output from the tests is not available until
//the YAHOO.Test.Runner is done running the suite
selenium.waitForCondition("!" + browser_bot + ".isRunning()", "10000");
String output = selenium.getEval("dom=getYUITestResults(" + browser_bot + ")");
JSONObject results = JSONObject.fromObject(output);
JSONObject test_case = results.getJSONObject("jsTestCase");
JSONArray testCasePropertyNames = test_case.names();
Iterator itr = testCasePropertyNames.iterator();
/*
* From the output, build an array with the following:
* Test file
* Test name
* status (result)
* message
*/
while(itr.hasNext()) {
String name = (String)itr.next();
if(name.startsWith("test")) {
JSONObject testResult = test_case.getJSONObject(name);
String test_name = testResult.getString("name");
String test_result = testResult.getString("result");
String test_message = testResult.getString("message");
Object[] testResultObject = {aBrowser.getCommand(), page_name, test_name, test_result, test_message};
testResults.add(testResultObject);
}
}
}
} finally {
//if an exception is thrown, this will guarantee that the selenium instance
//is shut down properly
selenium.stop();
selenium = null;
}
return testResults;
}
/**
* Inspects each test result and fails if the testResult was not "pass"
*/
@Test
public void inspectTestResults() {
if(!this.testResult.equalsIgnoreCase("pass")) {
fail(String.format(MESSAGE_FORMAT, this.browser, this.pageName, this.testName, this.message));
}
}
Я надеюсь, что это полезно.
Я'вэ был опубликован маленькая библиотека для проверки зависят от браузера JavaScript тестов без использования браузера. Это node.js модуль, который использует zombie.js чтобы загрузить тестовую страницу и проверить результаты. Я'вэ писал об этом в своем блоге. Вот что автоматизации выглядит так:
var browsertest = require('../browsertest.js').browsertest;
describe('browser tests', function () {
it('should properly report the result of a mocha test page', function (done) {
browsertest({
url: "file:///home/liam/work/browser-js-testing/tests.html",
callback: function() {
done();
}
});
});
});
Там's новый проект, который позволяет запускать помощью QUnit тесты в среде Java (как муравей), поэтому вы можете полностью интегрировать клиентские тестов с другими модульными тестами.
http://qunit-test-runner.googlecode.com
Я'вэ использовал его, чтобы проверить блок jQuery Плагины, objx по код, пользовательских ОО JavaScript, и это работает для всего, без изменений.
Проект я'м работает на использует Яш-тест-драйвер таких Жасмин в Chrome 10 с Жасмин-JSTD-адаптера включая использование код охват тесты, включенные в JS-тест-драйвером. Хотя есть некоторые проблемы каждый раз, когда мы изменять или обновлять браузеры на ци по окружающей среде Жасмин тестов довольно гладко лишь с незначительными проблемами с ansynchronous тестов, но насколько я'м курсе это можно обойти, используя жасмина часы, но я не'т получил шанс исправить их еще.
Я посмотрел на дату вопроса и тогда там были несколько хороших Яш испытания Либ/рамки. Сегодня можно найти намного больше и в разных фокус, как ТДД, БДД, Assetion и с/без поддержки бегунов.
Есть много игроков в этой игре, как Мокко, чай, помощью QUnit, Жасмин и т. д... Вы можете найти больше информации в этом блог о JS/мобильных/веб-тестирование...
Я'вэ написано в Ant-задачу, которая использует Фантом в JS, безголовый webkit-браузер, чтобы выполнить помощью QUnit тест файлов HTML в процессе сборки Ant. Он также может не построить, если никаких тестов не получится.
Это хорошая оценка несколько инструментов тестирования.
https://stackoverflow.com/questions/300855/looking-for-a-better-javascript-unit-test-tool
Я лично предпочитаю https://code.google.com/p/js-test-driver/
Еще один фреймворк для тестирования JS, который можно запустить с помощью Ant, - CrossCheck. В файле сборки проекта есть пример запуска CrossCheck через Ant.
CrossCheck пытается, с ограниченным успехом, эмулировать браузер, включая реализацию XMLHttpRequest и timeout/interval в макетном стиле.
Однако в настоящее время он не обрабатывает загрузку javascript с веб-страницы. Вы должны указать файлы javascript, которые вы хотите загрузить и протестировать. Если вы храните все свои JS отдельно от HTML, он может вам подойти.