0

現在、JSCover を Web サーバー モードで実行して、PhantomJS ヘッドレス ブラウザーで実行される Jasmine テストのカバレッジを判断しようとしています。また、grunt+nodejs を使用してテストを開始しています。

Gruntfile で JSCover サーバーを起動し、phantomJS を実行するために使用するコードは次のとおりです。

// Start JSCover Server
var childProcess = require('child_process'),
var JSCOVER_PORT = "43287";
var JAVA_HOME = process.env.JAVA_HOME;

var jsCoverChildArgs = [
        "-jar", "src/js/test/tools/JSCover-all.jar",
        "-ws",
        "--branch",
        "--port="+JSCOVER_PORT,
        "--document-root=./",
        "--report-dir=target/",
        "--no-instrument=src/js/lib/",
        "--no-instrument=src/js/test/",
        "--no-instrument=src/js/test/lib/"
    ];

var jsCoverProc = childProcess.spawn(JAVA_HOME + "/bin/java", jsCoverChildArgs);

// Start PhantomJS
var phantomjs = require('phantomjs'),
var binPath = phantomjs.path,

var childArgs = [
        'src/js/test/lib/phantomjs_jasminexml_runner.js',
        'http://localhost:'+JSCOVER_PORT+'/src/js/test/SpecRunner.html',
        'target/surefire-reports'
    ];
runner = childProcess.execFile(binPath, childArgs);

runner.on('exit', function (code) {
    // Tests have finished, so clean up the process
    var success = (code === 0) ? true : false;
    jsCoverProc.kill(); // kill the JSCover server now that we are done with it

    done(success);
}); 

ただし、cloudbees の Jenkins ノードで Web サーバーを実行し、それに対して phantomjs を実行すると、次のいずれかのエラーが発生します。

  • いくつかのテストの実行が開始されますが、プロセスは失敗します。

    A spec : should be able to have a mock lo-dash ... 
    Warning: Task "test" failed. Use --force to continue.
    
    Aborted due to warnings.
    Build step 'Execute shell' marked build as failure
    Recording test results
    Finished: FAILURE
    
  • PhantomJS が JSCover サーバーにアクセスできません:

    Running "test" task
    phantomjs> Could not load 'http://127.0.0.1:43287/src/js/test/SpecRunner.html'.
    Warning: Task "test" failed. Use --force to continue.
    

2 番目のエラーについては、設定した別のポートとホスト名を使用しようとしました (たとえば、ホスト名には 127.0.0.1 または localhost、ポートには 4327、43287 など)。ポートはビルド時に動的に設定されていません - 私のうなり声スクリプトでハードコーディングしています。

上記のエラーが発生する理由、または Cloudbees Jenkins ノードで JSCover サーバーの実行とアクセスに問題があるのはなぜですか (ただし、ローカル マシンでは発生しません)。

4

2 に答える 2

3

そのため、任意のプロセスで JSOver を実行すると、起動に時間がかかります。それよりも早く稼働することを期待すると、エラーが発生することは間違いありません。

素晴らしい記事からの引用: http://blog.johnryding.com/post/46757192364/javascript-code-coverage-with-phantomjs-jasmine-and

すべての要件を満たすコード カバレッジ ツールができたので、最後の部分は、このコードを Jenkins ビルドの一部として実行することでした (grunt スクリプトを使用します)。これは簡単に実行できましたが、一貫してビルドを壊す 2 つのエラーが発生しました。

  1. 時々、phantomJS が JSCover サーバーへの接続に失敗することがあった
  2. 時々、phantomJS はサーバーに接続しますが、実行中のランダムな時点でテストの実行を断念します。

これらは、私のチームの Jenkins ノードでのみ発生した非常に奇妙な問題で、簡単な修正であることが判明したにもかかわらず、診断が困難でした。

問題 1 の場合、このエラーは、phantomJS を実行する前に、私の grunt スクリプトが JSCover の開始を待機しなかったことが原因でした。

2 番目の問題については、私のチームが特別な jasmine テスト ランナーを使用して、テストの完了後に XML ファイルを作成していたことが判明しました。このファイルの問題点は、Jasmine が実行を完了するのを待つ機能がありましたが、テストの実行を断念する前に非常に短いタイムアウトを使用していたことです。これは Jenkins + JSCover の問題でした。テストをファイル システムから直接ではなく Web サーバーからロードする必要があったため、テストのロードと実行に時間がかかったためです。幸いなことに、この修正はタイムアウトを増やすのと同じくらい簡単でした。

于 2013-05-31T07:20:33.587 に答える