一般理论
Error: no display specified
Run Code Online (Sandbox Code Playgroud)
要理解该错误消息,首先必须了解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
Run Code Online (Sandbox Code Playgroud)
这指向我的本地X服务器.它可以指向我本地网络上的任何服务器.当客户端找到此环境变量时,它将连接到它并弹出用户界面.
如果客户端找不到这个环境变量 - 你会熟悉的
Error: no display specified
Run Code Online (Sandbox Code Playgroud)
回到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服务器,无论您拥有的)执行.在所有测试点之后是验证系统在更改后是否正常工作.在生产系统上运行它们没有多大价值 - 代码在部署后不会改变.
当然 - 由您自己决定 - 如果您看到在生产系统上进行这些测试的价值,请继续前进.