Выполнение тестов блока JavaScript без проблем в сборке непрерывной интеграции

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

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

Ответ 1

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

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

  • Запустите экземпляр 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

Создайте файл script для запуска модульных тестов и создания результатов теста (пример в 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, которая вызывает script:

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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