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


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

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

7 59

7 ответов:

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

что я сделал в двух словах:

  • запустить экземпляр Xvfb виртуальный фреймбуфер
  • используя JsTestDriver:
    • запуск экземпляра Firefox в виртуальный буфер кадров (без головы)
    • захват 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."

создайте цель муравья, которая вызывает скрипт:

<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>   

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

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

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

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

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

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

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

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

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

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

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

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

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