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

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

Кому-нибудь повезло автоматизировать (с помощью Муравей) библиотеку модульного тестирования, такую ​​как тест Юй, jQuery QUnit или jQUnit?

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

Связанный вопрос: stackoverflow.com/questions/300855/…

Jacques Bosch 13.05.2010 01:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
60
1
24 437
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Загляните в ЮИТест

Ответ принят как подходящий

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

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

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

И да, JSUnit обрабатывает таймауты: Моделирование времени в тестах JSUnit

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

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

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

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

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

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

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


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

Вы когда-нибудь настраивали это? Как прошло?

El Yobo 16.08.2010 08:34

Я сделал эту настройку, но с использованием немного других технологий. Я использовал тестовый драйвер JS для запуска модульных тестов в каждом браузере (а не в Selenium), используя адаптер QUnit (code.google.com/p/js-test-driver/wiki/QUnitAdapter). Другой, у моего текущего работодателя, я использую тестовую среду Jasmine и запускаю тесты в Jasmine Node (github.com/mhevery/jasmine-node), что позволяет избежать задержки с использованием браузера. Я использую свой собственный маленький рубиновый проект (github.com/karl/loris) для запуска тестов при каждом изменении.

Karl 19.08.2010 14:36

в значительной степени лучшее использование селена. чувак, я потратил кучу времени на эту штуку. ворчать ворчать ....

Randy L 08.12.2010 02:00

Привет @ Karl. Я тоже нашел qunit полезным инструментом, но не знаю, что именно тестировать. У меня есть игровая логика, написанная на javascript с комбинациями, анимацией. Не могли бы вы помочь мне с некоторой информацией? Спасибо.

Anahit Ghazaryan 07.12.2016 12:41

Я недавно прочитал статью Бруно об использовании JSUnit и создании фреймворка JsMock поверх этого ... очень интересно. Я подумываю использовать его работу, чтобы начать модульное тестирование моего кода JavaScript.

Имитация JavaScript или как выполнить модульное тестирование JavaScript вне среды браузера

Я большой поклонник js-тест-драйвер.

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

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

AutomatedTester 03.11.2009 19:18

Я согласен с тем, что JSUnit умирает на корню. Мы только что закончили замену его на YUI Test.

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

Для начала у нас есть базовый файл 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);
}

Что касается Selenium, мы использовали параметризованный тест. Мы запускаем наши тесты как в Internet Explorer, так и в Firefox в методе данных, анализируя результаты теста в список массивов объектов, каждый из которых содержит имя браузера, имя тестового файла, имя теста, результат (пройден, не пройден или проигнорирован). ) и сообщение.

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

@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));
    }
}

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

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

Однако у меня пока нет возможности поиграть с большой библиотекой, например, с прототипом.

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

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

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

В проекте, над которым я работаю, используется Js-Тест-Драйвер хостинг Жасмин в Chrome 10 с Жасмин-JSTD-Адаптер, включая использование тестов покрытие кода, включенных в JS-Test-Driver.

Хотя каждый раз, когда мы меняем или обновляем браузеры на CI среда, возникают некоторые проблемы, тесты Jasmine проходят довольно гладко, с небольшими проблемами с ансинхронными тестами, но, насколько мне известно, их можно обойти с помощью Jasmine Clock, но я не знаю пока не успел их исправить.

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

});

Я написал задачу Ant, которая использует PhantomJS, безголовый браузер WebKit, для запуска тестовых файлов HTML QUnit в процессе сборки Ant. Он также может не выполнить сборку, если какие-либо тесты не пройдут.

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

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

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

Я лично предпочитаю https://code.google.com/p/js-test-driver/

Я посмотрел на дату вашего вопроса, и тогда было несколько хороших библиотек и фреймворков для тестирования JavaScript.

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

В этой игре есть игроки много, такие как Мокко, Чай, QUnit, Жасмин и т. д.

Вы можете найти дополнительную информацию в блоге это о JavaScript, мобильном и веб-тестировании ...

Что такое «Утверждение»?

Peter Mortensen 05.01.2021 00:34

Другие вопросы по теме