一般理论
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 测试套件了。
2) 在您的 Windows 机器上安装 X 服务器。然后在您的 ssh 客户端设置中启用“X 转发”(或为 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 测试套件显然依赖它。
最后但并非最不重要的一点
集成测试(Selenium 测试就是这样)通常不在生产系统上运行,因为测试数据可能会留在生产数据库中。此外,获得良好的测试结果意味着尽可能与外部因素隔离 - 您的生产数据库的内容会不断变化,这可能会影响您的测试。
通常,在将新代码部署到生产服务器之前,所有测试都会在其他地方执行(您的开发机器、专用 QA 服务器,无论您拥有什么)。毕竟,测试的重点是验证系统在更改后是否正常工作。在生产系统上运行它们没有多大价值 - 代码在部署后不会更改。
当然——这取决于你——如果你看到在生产系统上进行这些测试的价值,那就继续吧。