Bezproblemowe Uruchamianie testów jednostkowych JavaScript w ciągłej integracji

Mam plan budowania webapp działa na systemie ciągłej integracji (Atlassian Bamboo 2.5). Muszę włączyć QUnit oparte na testach jednostkowych JavaScript do planu budowania, tak aby przy każdym kompilacji uruchamiane były testy Javascript, a Bamboo zinterpretował wyniki testów.

Najlepiej, aby proces budowania był "samodzielny", tak aby nie były wymagane żadne połączenia z zewnętrznymi serwerami. Dobre pomysły jak to osiągnąć? CI system uruchamiający proces budowania znajduje się na serwerze Linux Ubuntu.

Author: miek, 2010-01-15

7 answers

Ponieważ udało mi się wymyślić rozwiązanie, pomyślałem, że dobrym pomysłem będzie podzielenie się nim. Podejście może nie jest bezbłędne, ale to pierwsze, które wydawało się działać. Zachęcamy do publikowania ulepszeń i sugestii.

Co zrobiłem w skrócie:

    Po uruchomieniu Wirtualnego bufora ramek (framebuffer) można uruchomić instancję Xvfb (framebuffer).]}
  • Za Pomocą JsTestDriver :
    • Uruchom instancję Firefoksa w wirtualnym buforze ramki (bez głowy)
    • przechwyć instancję Firefoksa i uruchom zestaw testów
    • generowanie wyników testów zgodnych z JUnit .XML
  • Program Bamboo został stworzony z myślą o użytkownikach, którzy chcą korzystać z programu Bamboo.]}

Następnie przejdę przez bardziej szczegółowe fazy. Tak wyglądała moja struktura katalogów:

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

Na serwerze build:

  • Zainstaluj Xvfb (apt-get install Xvfb)
  • Zainstaluj Firefoksa (apt-get install firefox)

Do wbudowanej aplikacji:

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

Utwórz plik skryptu do uruchamiania testów jednostkowych i generowania wyników testów (przykład w 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."

Stwórz cel Mrówki, który wywoła scenariusz:

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

Na koniec powiedz Bambusowemu planowi budowy, aby oba wywołały cel test i szukały wyników testów JUnit. Tutaj domyślna "**/test-reports/*.xml" będzie odpowiednia.

 55
Author: miek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 09:48:26

Dla wszystkich zainteresowanych bezgłośnym uruchomieniem specyfikacji Jasmine BDD w mavenie, może zainteresować Cię wtyczka jasmine-maven, którą prowadzę:

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

 4
Author: Justin Searls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 16:05:54

Jako alternatywę, możesz również wypróbować TestSwarm. Mam go i działa za pomocą QUnit uruchomić moje testy JS.

 3
Author: Dom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 16:22:18

Przez ostatni rok grałem z wieloma rozwiązaniami, ale nie znalazłem nic w polu karmy (dawniej testacular). Spróbuj

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

 3
Author: Trey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-29 01:24:20

Możesz użyć rhino, bezgłowej przeglądarki, aby uruchomić testy jednostkowe na maszynie CI. Oczywiście wadą jest to, że nie znajdzie błędów specyficznych dla przeglądarki X... ale to przebija instalowanie 2-3 systemów operacyjnych na twoim pudełku CI, aby pokryć wszystkie główne platformy...

Ale tak, to jest do bani... ale to może działać wystarczająco dobrze w scenariuszu CI.

 0
Author: RyanWilcox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 12:34:35

Użyłem Mavena i junita, by zadzwonić do rhino. Nie jest elegancki, ale używam go do testowania podstawowych usług i kodu użytkowego.

Wymaga wyśmiewania nieobsługiwanych klas, takich jak XHR z bibliotekami Javy.

Stwierdziłem, że najlepiej jest kodować wszystko w javascript (testy itp.) i używać tylko junit do budowania organizacji i Hooka do CI.

Chciałbym zobaczyć, czy JsTestDriver może to zrobić. Albo mocha z reporterem junit.

 0
Author: jon077,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-23 19:40:54
 0
Author: Vivin Paliath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-25 23:34:34