Автоматическое тестирование модулей с помощью JavaScript

Я пытаюсь включить некоторые единицы измерения модуля JavaScript в мой процесс автоматической сборки. В настоящее время JSUnit хорошо работает с JUnit, но, похоже, он отказывается от программного обеспечения и не имеет хорошей поддержки AJAX, отладки и тайм-аутов.

Кто-нибудь удалил автоматизацию (с ANT) единую библиотеку тестирования, такую ​​как тест YUI, QUnit jQuery или jQUnit ( http://code.google.com/p/jqunit/ )?

Примечание. Я использую специализированную библиотеку AJAX, поэтому проблема с DOH Dojo заключается в том, что для работы с любыми тестируемыми модулями AJAX требуется использовать собственные вызовы функций AJAX и обработчики событий.

0
Связанный с этим вопрос: stackoverflow .com/вопросы/300855/& hellip;
добавлено автор Jacques Bosch, источник

14 ответы

Недавно я прочитал статью Бруно, используя JsUnit и создав структуру JsMock поверх этого ... очень интересно. Я подумываю использовать его работу, чтобы начать модульное тестирование моего кода Javascript.

Mock Javascript или Как модульный тест Javascript вне среды браузера

0
добавлено

Существует много javascript-модулей (jsUnit, scriptaculous, ...), но jsUnit - единственный, который я знаю, который можно использовать с автоматической сборкой.

Если вы выполняете «истинный» модульный тест, вам не нужна поддержка AJAX. Например, если вы используете инфраструктуру ajax RPC, такую ​​как DWR, вы можете легко написать функцию mock:

   function mockFunction(someArg, callback) {
      var result = ...;//some treatments   
      setTimeout(
function() { callback(result); }, 300 //some fake latency
); }

And yes, JsUnit do handle timeouts : Simulating Time in jsUnit Tests

0
добавлено

Look into YUITest

0
добавлено

Я опубликовал небольшую библиотеку для проверки зависимых от браузера 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();
        }
    });
});

});
0
добавлено

Я посмотрел вашу дату вопроса и обратно, тогда было несколько хороших JS-тестов lib/framework. Сегодня вы можете найти гораздо больше и в разных фокусах, таких как TDD, BDD, Assetion и с поддержкой/без поддержки бегунов.

В этой игре много игроков, таких как Mocha, Chai, QUnit, Jasmine и т. Д. Вы можете найти дополнительную информацию в этом блоге о тестировании JS/Mobile/web ...

0
добавлено

Другая структура тестирования JS, которая может быть запущена с Ant, CrossCheck . Пример использования CrossCheck через Ant в файле сборки для проекта.

CrossCheck пытается с ограниченным успехом эмулировать браузер, включая макетные реализации XMLHttpRequest и тайм-аута/интервала.

Однако он не обрабатывает загрузку JavaScript с веб-страницы. Вы должны указать файлы javascript, которые хотите загрузить и протестировать. Если вы сохраните все свои JS, отделенные от вашего HTML, это может сработать для вас.

0
добавлено

Я собираюсь начать Javascript TDD над новым проектом, над которым я работаю. Мой текущий план заключается в использовании qunit для проведения модульного тестирования. При разработке тестов можно запустить, просто обновив тестовую страницу в браузере.

Для непрерывной интеграции (и обеспечения того, чтобы тесты выполнялись во всех браузерах), я буду использовать Selenium для автоматической загрузки тестового жгута в каждом браузере и прочитать результат. Эти тесты будут выполняться при каждой проверке до источника.

Я также собираюсь использовать JSCoverage , чтобы получить анализ покрытия кода на основе кода. Это также будет автоматизировано с помощью Selenium.

В настоящее время я занимаюсь этим. Я уточню этот ответ с более точными подробностями, как только у меня получится настройка.


Инструменты тестирования:

0
добавлено
да, пожалуйста, поделитесь им. благодаря
добавлено автор melaos, источник
Я получил эту настройку, но использовал несколько разные технологии. Я использовал тестовый драйвер JS для запуска модульных тестов в каждом браузере (а не в Selenium), используя адаптер QUnit ( code.google.com/p/js-test-driver/wiki/QUnitAdapter ). Еще у моего нынешнего работодателя я использую тестовую среду Jasmine и запускаю тесты в Jasmine Node ( github.com/mhevery/jasmine-node ), что позволяет избежать задержк
добавлено автор Karl, источник
в значительной степени лучшее использование селена. человек, я потратил много времени на это. ворчать ворчать ....
добавлено автор the0ther, источник
Вы когда-нибудь получали эту настройку? Как прошло?
добавлено автор El Yobo, источник
Привет @ Karl.I также нашел qunit в качестве полезного инструмента, но не знаю точно, что тестировать. У меня есть игровая логика, написанная в JavaScript с комбинациями, анимациями. Можете ли вы помочь мне с некоторой информацией? Благодарю.
добавлено автор Anahit Ghazaryan, источник

Im a big fan of js-test-driver

Он отлично работает в среде CI и способен захватывать фактические браузеры для кросс-браузерного тестирования.

0
добавлено
Мне нравится это из-за интеграции CI, но думаю, что его лучшим плюсом является то, что он работает с YUITest и QUnit!
добавлено автор AutomatedTester, источник

Я согласен, что jsunit похож на виноградную лозу. Мы только что закончили замену с помощью теста YUI.

Как и в примере с использованием qUnit, мы запускаем тесты с использованием Selenium. Мы проводим этот тест независимо от наших других тестов на селен просто потому, что у него нет зависимостей, которые испытывают обычные регрессионные тесты UI (например, развертывание приложения на сервере).

Для начала у нас есть базовый файл javascript, который включен во все наши тестовые html-файлы. Это позволяет настроить экземпляр YUI, тестовый бегун, объект YUI.Test.Suite, а также Test.Case. У него есть методы, к которым можно получить доступ через Selenium для запуска набора тестов, проверьте, работает ли тестовый бегун (результаты недоступны до тех пор, пока это не будет сделано) и получите результаты теста (мы выбрали формат 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 в методе данных, анализируя результаты теста в список массивов объектов с каждым массивом, содержащим имя браузера, имя тестового файла, имя теста, результат (пропуск, отказ или игнорирование) и сообщение.

Фактический тест просто подтверждает результат теста. Если он не равен «pass», то он не проходит тест с сообщением, возвращенным из результата теста YUI.

    @Parameters
public static List data() throws Exception {
    yui_test_codebase = "file:///c://myapppath/yui/tests";

    List testResults = new ArrayList(); pageNames = new ArrayList(); 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 runJSTestsInBrowser(Browser aBrowser) { String yui_test_codebase = "file:///c://myapppath/yui/tests/"; String browser_bot = "this.browserbot.getCurrentWindow()" List testResults = new ArrayList(); 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)); } } 

Надеюсь, это полезно.

0
добавлено

Я просто получил Hudson CI для запуска JasmineBDD (безголовый), на наименее для чистого модульного тестирования javascript.

(Хадсон запускает Java через оболочку, запускает Envjs, запускает JasmineBDD.)

У меня еще не получилось хорошо играть с большой библиотекой, хотя, как прототип.

0
добавлено

Есть новый проект, который позволяет запускать qunit тесты в среде Java (например, ant), чтобы вы могли полностью интегрировать ваш тестовый пакет на стороне клиента с другими модульными тестами.

http://qunit-test-runner.googlecode.com

Я использовал его для модульного тестирования плагинов jQuery, код objx , пользовательский OO JavaScript и работает без изменений.

0
добавлено

Проект, над которым я работаю, использует Js-Test-Driver хостинг Жасмин в Chrome 10 с Jasmine-JSTD-Adapter , включая использование Code Coverage , включенные в JS-Test-Driver. Несмотря на некоторые проблемы при каждом изменении или обновлении браузеров в среде CI , запускаются тесты жасмина довольно гладко с незначительными проблемами с антисинхронными тестами, но насколько я знаю, они могут работать с использованием Jasmine Clock, но у меня еще не было возможности их исправлять.

0
добавлено

Я написал задачу Ant, которая использует Phantom JS , браузер безглавых веб-китов, для запуска тестовых файлов QUnit html в Ant процесс сборки. Это может также привести к сбою сборки, если какие-либо тесты не удались.

https://github.com/philmander/ant-jstestrunner

0
добавлено

Это хорошая оценка нескольких инструментов тестирования.

Инструменты тестирования блоков JavaScript для TDD

I personally prefer https://code.google.com/p/js-test-driver/

0
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

QA — вакансии и аналитика рынка вакансий
QA — вакансии и аналитика рынка вакансий
5 668 участник(ов)

Вакансии и поиск работы в сфере QA. Вопросы: @qa_ru Про деньги: @qa_fin При размещении вакансии указывать: - должность - компанию - требования к кандидату - условия и ЗП хэштеги: #город #типзанятости

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

QA — русскоговорящее сообщество
QA — русскоговорящее сообщество
3 625 участник(ов)

Общаемся про все виды тестирования и его автоматизацию. Без мата, грубостей и провокаций. События: @qaevents Вакансии: @qa_jobs Автоматизаторы: @qa_automation Слухи про компании: @qa_bad_company

Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

QA juniors
QA juniors
2 720 участник(ов)

Добро пожаловать в чат джуниоров QA! Общаемся обо всём, что связано с тестированием и не только :) В чате царит дружественная атмосфера, поэтому общаемся без мата, грубостей. @qa_automation - автоматизация @serious_tester - для тестировщиков и QA

QA - Bad Company!
QA - Bad Company!
2 602 участник(ов)

Позитив и негатив про компании или курсы, куда не стоит идти работать или учиться, а куда стоит. За пиратский контент - бан. @qa_fin о деньгах Русскоговорящее сообщество: @qa_ru Флудилка: @qaFlood Вакансии: @qa_jobs Финансы: @qa_fin

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

QA — Автоматизация
QA — Автоматизация
2 434 участник(ов)

1. Обсуждение технологий автоматизированного тестирования 2. Помощь начинающим Ru-сообщество: @qa_ru Джуночат: @qajuniors Вакансии: @qa_jobs Финансы: @qa_fin Митапы и события: @qaevents Паблики: @serious_tester, @automation_remarks, @atinfo

QA - Finance
QA - Finance
1 347 участник(ов)

Чат о деньгах тестировщиков. ЗП, релокейты,оферы. @qa_bad_company - обсуждение компаний/курсов и карьерного роста для QA @qa_automation - авто QA Холивары, политика, религия-бан Реклама, спам, оскорбления - бан Для флуда используйте другой чат

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском