Rubyから外部コマンドを実行する方法

1.起動後、呼び出した関数に制御がすぐ戻ること

やりたいこと
クライアントタイプのクラスAがあり、デバッグ用に相手側の擬似サーバーb.rbがあります。
クラスA用のテスト用にtest_A.rbがあり
今手動でb.rbを実行後、test_A.rbを実行していますが、test_A.rbからb.rbが起動できると楽かと思いました。

以下test_A.rb

require 'test/unit'
require 'A'


class Test_A < Test::Unit::TestCase

def setup
@obj = A.new
# execute b.rb ←ここで b.rbを実行したい
end

def test_A()
・・・
end
end

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/02/09 15:02:23
  • 終了:2007/02/16 15:05:03

回答(2件)

id:moro No.1

moro回答回数23ベストアンサー獲得回数102007/02/09 15:20:37

ポイント35pt

脊髄反射的な回答ですが、

Thread.new{ load 'b.rb' } でいかがでしょうか。

ないしは system("ruby b.rb &")とか。

http://www.ruby-lang.org/ja/man/?cmd=view;name=Thread

また、setup と teardown はテストケース実行のたびに毎回呼ばれますので注意してください。

問題があるなら、setupとは別のところで(class定義の前)で処理しちゃう、というのもありかもしれません。

id:garyo

>ないしは system("ruby b.rb &")とか。

Windowsなので"&"は効かないと思います;_;

>また、setup と teardown はテストケース実行のたびに毎回呼ばれますので注意してください。

これは知りませんでした。ありがとうございます。

>問題があるなら、setupとは別のところで(class定義の前)で処理しちゃう、というのもありかもしれません。


Aのクラス宣言の前に入れるとうまく動きました。ありがとうございます。

Thread.new{ load 'b.rb' }


追記:うまくいったと思ったのですが、b.rbをDOS窓から起動してtest_A.rbを動かすと

Finished in 0.656 seconds.

1 tests, 2 assertions, 0 failures, 0 errors

となるのですが、

test_A.rbからThread.new{ load 'b.rb' }を呼び出した場合は上記が表示されずどこかで止まったような感じになります。

2007/02/09 16:40:12
id:moro No.2

moro回答回数23ベストアンサー獲得回数102007/02/09 20:33:16

ポイント35pt

なんと

どうやら Thread.new したスレッドを終了前に待ってるっぽいですね。

# Mac だと普通に終了してるんですが。

ちょっと改良版で以下はいかがでしょうか。

この場合、前回注意したように、テストケースごとにサーバの起動・終了が入っちゃいますので、そのコストとの兼ね合いになるかと思います。

require 'test/unit'

class TestThread < Test::Unit::TestCase
  def setup
    @t = Thread.new { load 'b.rb' }
  end

  def teardown
    @t.kill
  end

  def test_true
    assert true
  end
end

URL は先ほどと同じです。

http://www.ruby-lang.org/ja/man/?cmd=view;name=Thread

いちおう、類似のプログラムを XP 上で走らせてみましたが、動いているようです。

(サーバ側は loop { sleep 1; puts "work" } とか言うコードで試しました )

id:garyo

ありがとうございます。

試して見ましたがやはり何か待ちで止まっているようです。

test_a.rbは(a.rb)でクライアント側を動かしているので、同一プログラムから同じポートに送受信しようとしているのが原因なのでしょうか。(a.rbがクライアントでb.rbがサーバーです)

@s = TCPSocket.open(@IP_Address, @Port_no)

2007/02/09 20:59:12

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません