人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: garyo
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:.new Class def require Ruby
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● moro
●35ポイント

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

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

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

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

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

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

◎質問者からの返答

>ないしは 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' }を呼び出した場合は上記が表示されずどこかで止まったような感じになります。


2 ● moro
●35ポイント

なんと

どうやら 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" } とか言うコードで試しました )

◎質問者からの返答

ありがとうございます。

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ