让我们说我有这种情况:
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服务器应该负载不足。