我使用PHPUnit进行一系列功能测试。在这些测试期间访问远程数据库。数据库只能通过SSH隧道访问。所以每次运行这些测试时,我都会在一个单独的终端中手动启动隧道。
在PHPUnit设置期间是否有一种优雅的方式来启动SSH隧道,然后在拆解时关闭隧道?
答案 0 :(得分:3)
我能想到的最干净的方法是" hotwire"引导代码:
// your bootstrap code above
// this gets called before first test
system("script_to_start_ssh_tunnel");
// this gets called after last test
register_shutdown_function(function(){
system("script_to_stop_ssh_tunnel");
});
// i went with 'system()' so you can also see the output.
// if you don't need it, go with 'exec()'
如果您需要将ssh隧道用于多个测试,这非常有用。
对于单个测试,您可以查看setUpBeforeClass
和tearDownAfterClass
。
此处提供了更多详细信息:phpunit docs
答案 1 :(得分:1)
@ alex-tartan让我朝着正确的方向前进。 This post也有帮助。为了完整起见,这是我使用的解决方案。使用控制套接字启动SSH隧道作为后台进程。在关机时检查套接字并退出后台进程。在每个单元测试设置中检查控制套接字,如果它已在运行,则跳过启动SSH。
protected function setUp()
{
...
if (!file_exists('/tmp/tunnel_ctrl_socket')) {
// Redirect to /dev/null or exec will never return
exec("ssh -M -S /tmp/tunnel_ctrl_socket -fnNT -i $key -L 3306:$db:3306 $user@$host &>/dev/null");
$closeTunnel = function($signo = 0) use ($user, $host) {
if (file_exists('/tmp/tunnel_ctrl_socket')) {
exec("ssh -S /tmp/tunnel_ctrl_socket -O exit $user@$host");
}
};
register_shutdown_function($closeTunnel);
// In case we kill the tests early...
pcntl_signal(SIGTERM, $closeTunnel);
}
}
我把它放在一个其他测试扩展的类中,所以隧道只设置一次并运行直到所有测试完成或者我们终止进程。