簡體   English   中英

如何通過ssh連接運行PHPUnit Selenium測試?

[英]How do I run PHPUnit Selenium tests over a ssh connection?

我正在使用yii框架,並試圖通過CentOS服務器上的ssh進行連接時運行其單元測試。 當我運行phpunit時,它嘗試啟動Firefox,但失敗並顯示錯誤“未指定顯示”

一般理論

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捆綁了測試。 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(內置硒RC)和Firefox。 您可能在那里也可能沒有他們。

3)使用虛擬幀緩沖區-例如Xvfb-一種X服務器,該X服務器在內存中執行所有繪圖操作,而不顯示任何輸出。

那有什么好處? Selenium具有命令,可在測試運行期間隨時獲取屏幕截圖並將其保存到文件中。 例如,典型的Selenium測試將檢查頁面上是否存在某個元素-並在不存在時進行屏幕截圖。 屏幕截圖隨后將保存在文件中,您稍后可以查看該文件以確定失敗的原因。 使用虛擬幀緩沖區可以很好地制作屏幕截圖。

最后澄清

請注意,Selenium測試只是PHPUnit可以運行的一種測試類型。 Selenium不需要編寫PHPUnit測試,它是一個可選的附件。 但是Yii測試套件顯然依賴它。

最后但並非最不重要的

集成測試(即Selenium測試)通常不會在生產系統上運行,因為有可能在生產數據庫中遺留下測試數據。 同樣,獲得良好的測試結果意味着要盡可能地與外部因素隔離-生產數據庫的內容將不斷變化,並且這可能會影響您的測試。

通常,在將新代碼部署到生產服務器之前,所有測試都將在其他地方(您的開發計算機,專用的QA服務器)執行。 畢竟,測試的目的是驗證更改后系統是否正常運行。 在生產系統上運行它們沒有太大價值-部署代碼后,代碼不會更改。

當然-由您決定-如果您認為在生產系統上進行這些測試有價值,那就繼續吧。

從Windows客戶端上的另一台代理計算機上運行gui測試的最簡單方法是使用“ psexec”( http://technet.microsoft.com/zh-cn/sysinternals/bb897553.aspx )。

它比您想象的要簡單。 在您的桌面上本地運行Selenium,確保在遠程服務器上設置了phpunit。 然后在您的SSH連接中啟動反向SSH隧道。 這取決於您的SSH客戶端。 在PuTTY中,有一個SSH隧道設置,您可以通過選擇遠程選項來反轉方向。 請查看此頁面以獲取詳細信息。 通過命令行使用OpenSSH,其操作如下:

ssh -R 4444:localhost:4444 user@remoteserver

這將在端口4444上的遠程服務器上進行偵聽,並將其轉發到在桌面端口4444上的localhost上運行的硒服務器。

完成此操作后,您需要在yourproject / protected / tests / WebTestCase.php中更改TEST_BASE_URL設置,以轉到yii項目的遠程服務器的URL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM