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

2sbarzqh  于 2023-11-17  发布在  Linux
关注(0)|答案(3)|浏览(121)

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

r9f1avp5

r9f1avp51#

  • 一般理论 *
Error: no display specified

字符串
要理解这个错误消息,你首先必须理解X窗口系统是如何工作的--这是Linux(和其他类型的Unix)系统用来显示图形用户界面的框架的名称。
X由两部分组成-有一个客户端和一个服务器。客户端是想要绘制界面的程序-在你的情况下是Firefox。服务器是一个使绘制成为可能的程序。所有主要的操作系统都有X服务器。Linux和OSX通常都有一个,在Windows上你必须找到并安装一个-Cygwin/X是一个选择,但还有其他人

那么,为什么需要这种客户端/服务器架构?

如果你碰巧在本地运行Linux,那么你甚至不会注意到有任何类型的客户端/服务器通信发生在某个地方-但确实有。
不过,X的闪光点在于,这种架构意味着它内置了网络功能。你可以在一台机器上运行一个客户端(Firefox),在另一台完全不同的机器上显示GUI。你可以在10台不同的机器上运行10个不同的客户端,让它们都在一台机器上显示输出。想想VNC或远程桌面- X有点类似,但你可以说它和那些相比是类固醇。X已经有这种能力很长时间了。
每当你启动一个X客户端(一个想要显示图形用户界面的程序)时,它会寻找一个X服务器。客户端找到一个X服务器的一种可能性是一个名为xsd的环境变量。我在OSX上,这是我看到的。

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


这指向我的本地X服务器。它可以指向我的本地网络上的任何服务器。当客户端找到这个环境变量时,它将连接到它,并弹出用户界面。
如果客户端找不到此环境变量-您将得到熟悉的

Error: no display specified

返回Yii

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

如何解决这个问题?

有三种选择
1.在本地安装Yii、PHPUnit和它们的所有依赖项。Selenium在Windows上运行得很好。它不会在Windows上使用X协议,所以与X客户端和X服务器无关。然后你可以在本地运行Yii testsuite。
1.在Windows机器上安装X服务器。然后在ssh客户端设置中启用“X转发”(或者对ssh使用-X命令行参数)。那么当你登录到那个CentOS服务器的时候,就会有一个设置好的变量。你可以通过输入上面的echo命令来验证它。然后CentOS上的X客户端就可以说话了(show GUI)到Windows机器上的X服务器-所有的X流量都是通过ssh连接隧道传输的。然而,这意味着你需要Java(Selenium RC内置)和Firefox在CentOS服务器上。你可能有也可能没有它们。
1.使用虚拟帧缓冲区-例如Xvfb-一个X服务器,它在内存中执行所有绘制操作,不在任何地方显示任何输出。
那有什么用Selenium有一些命令可以在测试运行过程中的任何时候截取屏幕截图并将其保存到文件中。例如,典型的Selenium测试会检查页面上是否存在某个元素,并在不存在时截取屏幕截图。屏幕截图将保存在一个文件中,您可以稍后查看该文件以确定失败的原因。使用虚拟帧缓冲区制作屏幕截图工作正常。

最后澄清

注意Selenium测试仅仅是PHPUnit可以运行的测试类型之一。Selenium不是编写PHPUnit测试所必需的,它是一个可选的附加组件。但是Yii testsuite显然依赖于它。

最后但并非最不重要

集成测试(Selenium测试)通常不会在生产系统上运行,因为测试数据有可能会留在生产数据库中。此外,获得良好的测试结果意味着尽可能与外部因素隔离-生产数据库的内容会不断变化,这可能会影响测试。
通常情况下,在新代码部署到生产服务器之前,所有测试都将在其他地方执行(您的开发机器,专用QA服务器,无论您拥有什么)。毕竟,测试的目的是验证系统在更改后是否正常工作。在生产系统上运行测试没有太大价值-代码在部署后不会更改。
当然,这取决于您,如果您认为在生产系统上进行这些测试是有价值的,那就继续吧。

zsohkypk

zsohkypk2#

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

ssh -R 4444:localhost:4444 user@remoteserver

字符串
这将侦听端口4444上的远程服务器,并将其转发到桌面端口4444上的本地主机上运行的selenium服务器。
一旦你完成了这一步,你需要在yourproject/protected/tests/WebTestCase.php中修改TEST_BASE_URL设置,以转到yii项目的远程服务器的URL。

r1wp621o

r1wp621o3#

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

相关问题