2011-11-14 13 views
3

次のケーキファイルタスクを実行して、正常に実行され、テストの最後に到達しますが終了しないセレンテストを実行します。coffeeスクリプトcakefileタスクが終了していません

muffin = require 'muffin' 
wrench = require 'wrench' 
http = require 'http' 
fs  = require 'fs' 
spawn = require('child_process').spawn 
exec = require('child_process').exec 

task 'selenium', 'run selenium tests', (options) -> 
    sel = require './test/selenium' 
    app = spawn 'node', ['app.js'] 
    app.stdout.on 'data', (data) -> 
     if /listening on port/.test data 
      selenium = spawn 'selenium' 
      selenium.stdout.on 'data', (data) -> 
       console.log 'stdout: ' + data 
       if /Started.*jetty.Server/.test data 
        sel.run -> 
         app.stdin.end() 
         selenium.stdin.end() 
         console.log 'completed Selenium Tests' 

仕上げを完了する方法はありますか?コンソールに「完了したSelenium Tests」が記録されます。

+0

'Cakefile'ではなく' .coffee'で同じコードを( 'task 'selenium''ビットを除いて)実行しても、同じ動作をします。 –

+0

私はこのコードをすべてvanilla javascriptと自動的に実行するケーキファイルの外に変換しました。同じ結果が得られます –

答えて

0

トレバー・バーナム、正しい方向に私を指摘しました。しかし、基本的な問題は、私が産んでいたセレンの子プロセスが、Javaプロセスを実行するシェルスクリプトだということでした。基本的にはapp.kill()を呼び出すときに、シェルスクリプトを強制終了していましたが、基本となるJavaプロセスは終了していませんでした。

ありがとうございました。

2

2つの子プロセスのいずれか(appおよびselenium)がまだ実行されている場合、メインプロセスは引き続き実行されます。 stdin.end()を呼び出してもこれは変わりません。やりたいことkill method適切な名前で、死ぬためにそれらを強制することです:

app.kill() 
selenium.kill() 
console.log 'completed Selenium Tests' 
+0

ありがとう、私はこれを試しても、幸運のないkill()メソッドと一緒に.end()メソッドを使用しました。 –

+0

Nodeドキュメントは次のように言っています: "この関数は' kill'と呼ばれますが、子プロセスに渡されるシグナルは実際にはそれを殺さないかもしれません。どのプロセスが終了していないかを知るために 'app.on 'exit'、 - > console.log 'app exited''(と同様に' selenium')を追加してみてください。 –

+0

ありがとう、私はセレンの子プロセスが殺されていることがわかりました。私の間違いは、私はそれがJavaプロセス自体ではなく、セレンを開くシェルスクリプトを殺していたことに気づきませんでした!ありがとう、あなたは私が解決に手伝った。 –

0

もう1つの方法はprocess.exit()です。しかし、私は子供にどのような影響があるか分かりません。

関連する問題