ruby - 杀死通过线程启动的进程

标签 ruby multithreading unit-testing process

我有一个使用套接字进行通信的 headless 应用程序。启动后,它会保持事件状态,直到发送一条消息告诉它退出(或者它崩溃或被杀死)。

当使用 Ruby 对该应用程序进行单元测试时,我需要启动该进程,与其交互(通过套接字),然后终止它。

我认为我可以使用这种模式来做到这一点:

class TestServer < MiniTest::Unit::TestCase
  def setup
    @thread = Thread.new{ `#{MY_COMMAND}` }
  end

  def test_aaa
    # my test code
  end

  def teardown
    @thread.kill if @thread
  end
end

但是,teardown 代码会终止线程,但不会终止线程启动的进程

我怎样才能以这样的方式启动流程:

  1. 允许它在后台运行(立即将控制权返回给我的 Ruby 测试工具)
  2. 如果需要,允许我稍后强制终止进程。

我碰巧在 OS X 上进行开发,但如果可能的话,我希望有一个适用于所有运行 Ruby 的操作系统的通用解决方案。

最佳答案

您可以使用 Process.spawn 代替线程和反引号:

class TestServer < MiniTest::Unit::TestCase
  def setup
    @pid = spawn "#{MY_COMMAND}"
  end

  def test_aaa
    # my test code
  end

  def teardown
    Process.kill('TERM', @pid) if @pid
  end
end

关于ruby - 杀死通过线程启动的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31758398/

相关文章:

ruby-on-rails - NoMethodError:Roo::CSV:Class 未定义方法 `generate'

android - 使用UI-Thread更新ImageView的位图

javascript - 如何测试这种依赖性?

c# - Visual Studio 中的文件驱动单元测试?

c# - 在实现中设置私有(private) Setter 的模拟 void 方法

ruby-on-rails - JSON::ParserError: 757: '{ 处的意外标记

mysql - 按整数值分类和 COUNT() 的 sql 优化

ruby-on-rails - 在任何来源中都找不到 rake-10.0.4 (Bundler::GemNotFound)

java - 当多个线程同时尝试获取信号量许可时设置优先级

java - 如何在 Blackberry 中安排特定线程