Автоматическое выполнение модульных тестов JavaScript в сборке с непрерывной интеграцией

У меня есть план сборки веб-приложения, работающий в системе непрерывной интеграции (Atlassian Bamboo 2.5). Мне нужно включить модульные тесты JavaScript на основе QUnit в план сборки, чтобы при каждой сборке тесты Javascript будет запущен, и Bamboo интерпретирует результаты теста.

Предпочтительно, чтобы я мог сделать процесс сборки «автономным», чтобы не требовалось никаких подключений к внешним серверам. Хорошие идеи, как этого добиться? Система CI, запускающая процесс сборки, находится на сервере Ubuntu Linux.


person miek    schedule 15.01.2010    source источник
comment
Кажется, Джошуа Фланаган придумал нечто подобное в среде C # / IE, используя Watin, NUnit и IterativeTest: lostechies.com/blogs/joshuaflanagan/archive/2008/09/18/   -  person miek    schedule 15.01.2010
comment
RhinoUnit обеспечивает возможность автономного запуска модульных тестов JS, однако добавление поддержки QUnit, вероятно, потребует дополнительной работы: code.google.com/p/rhinounit   -  person miek    schedule 15.01.2010


Ответы (7)


Поскольку мне самому удалось придумать решение, я подумал, что было бы неплохо поделиться им. Подход, возможно, не безупречный, но он первый, который, похоже, сработал. Не стесняйтесь публиковать улучшения и предложения.

Вкратце, что я сделал:

  • Запустите экземпляр Xvfb, виртуального буфера кадра.
  • Using JsTestDriver:
    • launch an instance of Firefox into the virtual framebuffer (headlessly)
    • захватите экземпляр Firefox и запустите набор тестов
    • генерировать результаты тестов, совместимые с JUnit .XML
  • Используйте Bamboo, чтобы проверить файл результатов, чтобы пройти сборку или нет.

Далее я рассмотрю более подробные этапы. Вот как выглядела моя структура каталогов:

lib/
    JsTestDriver.jar
test/
    qunit/
            equiv.js
            QUnitAdapter.js
    jsTestDriver.conf
    run_js_tests.sh
    tests.js
test-reports/
build.xml

На сервере сборки:

  • Установить Xvfb (apt-get install Xvfb)
  • Установите Firefox (apt-get install firefox)

В ваше приложение, которое будет построено:

server: http://localhost:4224

load:
# Load QUnit adapters (may be omitted if QUnit is not used)
  - qunit/equiv.js
  - qunit/QUnitAdapter.js   

# Tests themselves (you'll want to add more files)
  - tests.js

Создайте файл сценария для запуска модульных тестов и генерации результатов тестов (пример в Bash, run_js_tests.sh):

#!/bin/bash
# directory to write output XML (if this doesn't exist, the results will not be generated!)
OUTPUT_DIR="../test-reports"
mkdir $OUTPUT_DIR

XVFB=`which Xvfb`
if [ "$?" -eq 1 ];
then
    echo "Xvfb not found."
    exit 1
fi

FIREFOX=`which firefox`
if [ "$?" -eq 1 ];
then
    echo "Firefox not found."
    exit 1
fi

$XVFB :99 -ac &    # launch virtual framebuffer into the background
PID_XVFB="$!"      # take the process ID
export DISPLAY=:99 # set display to use that of the xvfb

# run the tests
java -jar ../lib/JsTestDriver.jar --config jsTestDriver.conf --port 4224 --browser $FIREFOX --tests all --testOutput $OUTPUT_DIR

kill $PID_XVFB     # shut down xvfb (firefox will shut down cleanly by JsTestDriver)
echo "Done."

Создайте цель Ant, которая вызывает сценарий:

<target name="test">        
    <exec executable="cmd" osfamily="windows">
        <!-- This might contain something different in a Windows environment -->
    </exec>

    <exec executable="/bin/bash" dir="test" osfamily="unix">
        <arg value="run_js_tests.sh" />
    </exec>
</target>   

Наконец, скажите плану сборки Bamboo как вызвать цель test, так и поискать результаты теста JUnit. Здесь подойдет значение "**/test-reports/*.xml" по умолчанию.

person miek    schedule 15.01.2010

Для всех, кто заинтересован в автономном запуске своих спецификаций Jasmine BDD в maven, вас может заинтересовать поддерживаемый мной jasmine-maven-plugin:

http://github.com/searls/jasmine-maven-plugin

person Justin Searls    schedule 03.09.2010

В качестве альтернативы вы также можете попробовать TestSwarm. Я установил его и запустил с помощью QUnit для запуска моих JS-тестов.

person Dom    schedule 15.01.2010

Я пробовал использовать несколько решений за последний год, но я не нашел ничего в приблизительной Karma (ранее testacular). Попробуйте

http://karma-runner.github.com/

person Trey    schedule 29.03.2013

Я использовал maven и junit для вызова носорога. Это не изящно, но я использую его для тестирования базовых сервисов и служебного кода.

Это требует имитации неподдерживаемых классов, таких как XHR с библиотеками Java.

Я обнаружил, что лучше всего кодировать все на javascript (тесты и т. Д.) И использовать только junit для организации сборки и подключения к CI.

Я бы хотел посмотреть, сможет ли JsTestDriver это сделать. Или мокко с репортером junit.

person jon077    schedule 23.03.2012

Вы можете использовать rhino, безголовый браузер, для запуска модульных тестов на вашей машине CI. Конечно, недостатком здесь является то, что он не обнаруживает ошибок, специфичных для браузера X ... но он лучше, чем установка 2-3 ОС на ваш CI-бокс, чтобы охватить все основные платформы ...

Но да, это отстой ... но это может сработать достаточно хорошо в сценарии CI.

person RyanWilcox    schedule 15.01.2010
comment
Мне действительно было интересно, можно ли использовать Rhino или HtmlUnit вместе с JsTestDriver. Однако пока не мог понять ... - person miek; 15.01.2010

JS Test Runner - довольно хорошее решение. Он использует PhantomJS и QUnit.

person Vivin Paliath    schedule 25.07.2012