在Cucumber中分叉/启动子进程的首选方法

时间:2017-02-06 12:19:57

标签: ruby cucumber fork

让我们说我有这种情况:

Scenario: Test LDAP access
Given that the LDAP dummy server is started
And the LDAP query is executed
...     

我希望在该步骤中启动LDAP服务器。就我而言,我使用ruby-ldapserver,所以理论上我可以在我的步骤中执行此操作:

args = { ... }
@ldap_pid = fork do
   redirect_stdout_stderr_to_logfile()
   wait_for_ldap_requests(args)
   exit   # avoid messing with Cucumber/web driver cleanup
end

...

After do
 if @ldap_pid
   Process.kill("HUP", @ldap_pid)
   Process.wait @ldap_pid
 end

完全不同的方法:

system("some_script_that_starts_ldap_dummy < #{input} >#{tmpfile} 2>&1 &")

这当然有效,但相当不优雅(从ruby内部启动一个ruby程序 - 不必要的进程创建,我也需要为该子程序设置输入参数)。

所有这一切,我对这两种方法都不太全面(&#34;温暖的模糊感觉&#34;不存在)。

这些事情的标准方法是什么? 有一个可以说的吗?黄瓜能带来什么东西可以支持我吗?我应该运行一些东西来告诉Cucumber它已经分叉并且应该像子进程一样处理它自己吗?

编辑:实际上,在使用fork方法时,我根本没有注意到DB的任何问题。我 注意到如果我用SIGINT杀死了孩子,那么 打破我的情况下的网络驱动程序(Poltergeist / PhantomJS)。一个正常运作的解决方法是发送SIGHUP,通过优雅地关闭(如果需要)但调用exit来处理它;然后,几秒钟之后SIGKILL(这会让孩子无法关闭任何协议并将其撕掉)。不好......并且没有竞争条件,比如说CI服务器应该负载不足。

0 个答案:

没有答案