【问题标题】:How do I run PHPUnit Selenium tests over a ssh connection?如何通过 ssh 连接运行 PHPUnit Selenium 测试?
【发布时间】:2011-04-28 21:46:28
【问题描述】:

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

【问题讨论】:

  • 在提出这类问题时,您需要提供更多详细信息。您是否尝试在运行 Linux 的本地计算机上运行单元测试?如果是这样,您是尝试在 xterm 中还是从“文本”控制台执行此操作?或者您是否正在通过 ssh 登录到其他 Linux 主机?
  • 如果可能的话,我正试图在 CentOS 服务器上通过 ssh 只使用 Bash 来完成它。我正在关注 Yii 上的敏捷开发一书并在服务器上使用 selenium。我正在 Windows 7 上设置本地环境,但除了生产环境之外,我真的没有看到在任何东西上运行测试的意义。也许除了硒以外的其他东西应该可以解决问题?
  • 为了清楚起见,我冒昧地编辑了您的问题,希望您不要介意。

标签: linux selenium ssh phpunit yii


【解决方案1】:

一般理论

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 服务器,无论您拥有什么)。毕竟,测试的重点是验证系统在更改后是否正常工作。在生产系统上运行它们没有多大价值 - 代码在部署后不会更改。

当然——这取决于你——如果你看到在生产系统上进行这些测试的价值,那就继续吧。

【讨论】:

    【解决方案2】:

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

    ssh -R 4444:localhost:4444 user@remoteserver
    

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-04-02
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 2010-11-27
        • 2012-05-06
        • 2015-03-12
        相关资源
        最近更新 更多