分散システムのテストの自動化
複数のプロセスが相互に連携して動くシステムのテストを自動化したい。ありがちに書くとプロセスを起動すると終了するまで待ってしまうので、同時に複数のプロセスを起動できなくて困る。バックグラウンドで起動させておいて後で終了させたとき、 ps aux | grepしてPIDを調べて、しばらくポーリングして本当に終了するまで待つ、とか面倒すぎる。
あと起動してからしばらくは初期化処理をやっているので、標準出力に「started」と表示されるまで待ちたかったりする。
問題はプロセスをバックグラウンドで起動させると、そのプロセスの扱いが面倒すぎるところ。そこを上手く扱えれば、シグナルを飛ばしたり、標準出力に「started」と表示されるまで待ったりするのは造作もないハズ。
そこでプロセスをオブジェクトとして扱えるようにすればいいという案。
mgr = Process.new("cmdline") srv1 = Process.new("cmdline") srv2 = Process.new("cmdline") mgr.stdout_join("started") srv1.stdout_join("started") srv2.stdout_join("started") ctl = Process.new("cmdline") ctl.join mgr.stdout_join("finished") test = Process.new("cmd") test.stdout_join("start") srv1.kill test.join
ついでにリモートホスト上のプロセスも透過的に扱いたい。sshでコマンドを起動して…とかやればいいかな。シグナルを飛ばすときはそのホストにログインしてからkill。
※追記
Process.newとか長いから、適当なmoduleのメソッドでラップしておいて、先頭でincludeすれば短くてイイ感じ。
include HogeModule mgr = spawn("cmdline")