如何通过ssh连接运行PHPUnit Selenium测试?

时间:2010-10-21 23:05:52

标签: linux selenium ssh phpunit yii

我正在使用yii框架并尝试在CentOS服务器上通过ssh连接时运行其单元测试。当我运行phpunit时,它会尝试启动Firefox,但失败并显示错误“no display specifiediied”

3 个答案:

答案 0 :(得分:8)

一般理论

Error: no display specified

要理解该错误消息,首先必须了解X Windowing System的工作原理 - 这是用于显示图形用户界面的Linux(以及其他类型的Unix)系统所使用的框架的名称。

X由两部分组成 - 有一个客户端和一个服务器。客户端是想要绘制界面的程序 - 在您的情况下是Firefox。服务器是一个使绘图成为可能的程序。所有主要操作系统都有X服务器。 Linux和OSX通常附带一个,在Windows上你必须找到并安装一个 - Cygwin/X是一个选项,但还有其他选项。

那为什么这个客户端/服务器架构甚至是必要的呢?

大部分时间甚至不需要它。如果您碰巧在本地运行Linux,那么您甚至不会注意到某处发生了任何类型的客户端/服务器通信 - 但确实如此。

虽然X虽然闪耀,但这种架构意味着网络功能已经内置于其中。您可以在一台计算机上运行客户端(Firefox),并在完全不同的计算机上显示GUI。感谢X,你可以在10台不同的机器上运行10个不同的客户端,并让它们在一台机器上全部显示输出。想想VNC或远程桌面 - X有些相似,但你可以说它与类固醇有关。 X已经有很长一段时间了。

每当你启动一个X客户端(一个想要显示图形用户界面的程序)时,它就会寻找一个X服务器。客户端找到一种可能性是名为DISPLAY的环境变量。我在OSX上,这就是我所看到的。

[~]> echo $DISPLAY
/tmp/launch-ihNtDq/org.x:0

这一点指向我的本地X服务器。它可以指向我本地网络上的任何服务器。当客户端找到此环境变量时,它将连接到它并弹出用户界面。

如果客户端找不到此环境变量,您将获得熟悉的

Error: no display specified

返回Yii

看起来Yii捆绑了Selenium个测试。 PHPUnit需要启动Selenium RC来控制Firefox实例来运行这些测试。 Selenium RC(或者可能是Firefox本身)无法找到DISPLAY环境变量。并因上述错误而死亡。

您如何解决此问题?

有3个选项

1)在本地安装Yii,PHPUnit及其所有依赖项。 Selenium在Windows上运行得很好。它不会在Windows上使用X协议,所以没有与X客户端和X服务器的业务。然后你可以在本地运行Yii testsuite。

2)在Windows机器上安装X服务器。然后在ssh客户端设置中启用“X Forwarding”(或使用ssh的-X命令行参数)。当您这样做时,当您登录到该CentOS服务器时将会设置一个DISPLAY变量。您可以通过键入上面的echo命令来验证它。然后,CentOS上的X客户端可以与Windows机器上的X服务器通话(显示GUI) - 所有X流量都通过ssh连接进行隧道传输。然而,这意味着您需要在该CentOS服务器上安装java(内置selenium RC)和Firefox。你可能有也可能没有。

3)使用虚拟帧缓冲区 - 例如Xvfb - 一个X服务器,它在内存中执行所有绘图操作,不会在任何地方显示任何输出。

那有什么用? Selenium具有在测试运行期间随时截取屏幕截图并将其保存到文件的命令。例如,典型的Selenium测试将检查页面上是否存在元素 - 并且当它不存在时进行屏幕截图。屏幕截图随后将保存在文件中,您可以稍后查看该文件以确定失败的原因。使用虚拟帧缓冲区制作截图效果很好。

最终澄清

请注意,Selenium测试只是PHPUnit可以运行的一种测试类型。 Selenium不需要编写PHPUnit测试,它是一个可选的附加组件。但Yii testsuite显然依赖它。

最后,但并非最不重要

集成测试(Selenium测试)通常不在生产系统上运行,因为测试数据有可能留在生产数据库中。此外,获得良好的测试结果意味着尽可能地隔离外部因素 - 生产数据库的内容将不断变化,这可能会影响您的测试。

在将新代码部署到生产服务器之前,通常所有测试都将在其他地方(您的开发机器,专用QA服务器,无论您拥有的)执行。在所有测试点之后是验证系统在更改后是否正常工作。在生产系统上运行它们没有多大价值 - 代码在部署后不会改变。

当然 - 由您自己决定 - 如果您看到在生产系统上进行这些测试的价值,请立即行动。

答案 1 :(得分:0)

比你想象的要简单。在桌面上本地运行Selenium,确保在远程服务器上设置了phpunit。然后在SSH连接中启动反向SSH隧道。这取决于您的SSH客户端。在PuTTY中,有一个SSH隧道设置,您可以通过选择远程选项来反转方向。查看this page了解详情。使用命令行中的OpenSSH,其完成如下:

ssh -R 4444:localhost:4444 user@remoteserver

这将侦听端口4444上的远程服务器,并将其转发到运行在桌面端口4444上的localhost上的selenium服务器。

完成后,您需要更改 yourproject / protected / tests / WebTestCase.php 中的 TEST_BASE_URL 设置,转到远程服务器的URL为你的yii项目。

答案 2 :(得分:0)

在Windows客户端上从另一台代理计算机运行gui测试的最简单方法是使用“psexec”(http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx)。