web-dev-qa-db-ja.com

継続的インテグレーションのビルドでJavaScriptユニットテストをヘッドレスで実行する

継続的インテグレーションシステム( Atlassian Bamboo 2.5)で実行されているwebappビルドプランがあります。各ビルドでJavascriptテストが実行され、Bambooがテスト結果を解釈できるように、ビルドプランに QUnit -ベースのJavaScriptユニットテストを組み込む必要があります。

できれば、外部サーバーへの接続が不要になるように、ビルドプロセスを「スタンドアロン」にできるようにしたいと思います。これを達成する方法についての良いアイデアは?ビルドプロセスを実行しているCIシステムは、Ubuntu Linuxサーバー上にあります。

59
miek

自分で解決策を考え出すことができたので、それを共有することをお勧めします。アプローチは完璧ではないかもしれませんが、それが機能するように思われた最初のものです。改善や提案を投稿してください。

簡単に言えば:

  • 仮想フレームバッファである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

ビルドするアプリケーションに:

サーバー:http:// localhost:4224 
 
 load:
#QUnitアダプターをロードします(QUnitを使用しない場合は省略できます)
 -qunit/equiv.js 
-qunit/QUnitAdapter.js 
 
#自分自身をテストします(ファイルを追加する必要があります)
-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>   

最後に、testターゲットを呼び出すことと、JUnitテスト結果を探すことの両方をBambooビルドプランに伝えます。ここではデフォルトの"**/test-reports/*.xml"は問題ありません。

55
miek

JavenのBDD仕様をMavenでヘッドレスで実行することに興味がある人は、私が保守しているjasmine-maven-pluginに興味があるかもしれません。

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

4
Justin Searls

過去1年間、いくつかの解決策を試してきましたが、カルマの球場(以前の遺言)には何も見つかりませんでした。試してみる

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

3
Trey

別の方法として、TestSwarmを試すこともできます。 JUnitテストを実行するためにQUnitを使用して実行しました。

3
Dom

Mavenとjunitを使用してrhinoを呼び出しました。エレガントではありませんが、基本的なサービスとユーティリティコードのテストに使用しています。

Javaライブラリを使用したXHRのように、サポートされていないクラスをモックする必要があります。

私はそれがjavascript(テストなど)のすべてをコード化するのに最適であり、ビルドユニットとCIへのフックにjunitのみを使用することを発見しました。

JsTestDriverがそれを実行できるかどうかを確認したいのですが。またはjunitレポーターとモカ。

0
jon077

ヘッドレスブラウザーであるrhinoを使用して、CIマシンでユニットテストを実行できる場合があります。もちろん、ここでの不利な点は、ブラウザXに固有のバグが見つからないことです...しかし、すべてのメインプラットフォームをカバーするために、CIボックスに2〜3個のOSをインストールするよりも優れています...

しかし、そうです、この種の問題は...でも、CIシナリオでは十分に機能する可能性があります。

0
RyanWilcox

JS Test Runner はかなり良い解決策です。 PhantomJSとQUnitを使用します。

0
Vivin Paliath