我正在使用yii框架並嘗試通過CentOS服務器上的ssh連接時運行其單元測試。當我運行PHPUnit的,它試圖啓動Firefox,它失敗,出現錯誤「無顯示specifiied」如何通過ssh連接運行PHPUnit Selenium測試?
回答
一般理論
Error: no display specified
要了解你首先有一個錯誤信息,以瞭解如何在X窗口系統工作 - 這是用於顯示圖形用戶界面的Linux(以及其他類型的Unix)系統所使用的框架的名稱。
X由兩部分組成 - 有一個客戶端和一個服務器。客戶端是想要繪製界面的程序 - 在你的情況下是Firefox。服務器是一個使繪圖成爲可能的程序。所有主要操作系統都有X服務器可用。 Linux和OSX通常附帶一個,在Windows上您將不得不找到並安裝一個 - Cygwin/X是一種選擇,但也有其他選項。
那麼爲什麼這個客戶機/服務器體系結構甚至是必要的呢?
大部分時間它甚至不需要。如果您碰巧在本地運行Linux,那麼您甚至不會注意到某處存在任何類型的客戶端/服務器通信 - 但有。
儘管X的亮點在於,這種體系結構意味着網絡功能正好嵌入其中。您可以在一臺機器上運行客戶端(Firefox),並在完全不同的機器上顯示GUI。您可以在10臺不同的計算機上運行10個不同的客戶端,並通過X在單臺計算機上顯示輸出。認爲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 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測試套顯然依賴於它。
最後,但並非最不重要
集成測試(其中硒測試)通常不運行在生產系統中,因爲有機會測試數據在生產數據庫留下。此外,獲得良好的測試結果意味着儘可能地隔離外部因素 - 生產數據庫的內容將不斷變化,這可能會影響您的測試。
通常所有的測試將在其他地方執行(你的開發機,專用QA服務器,不管你有),之後將新代碼部署到生產服務器。在所有的測試點都要驗證系統在更改後工作。在生產系統上運行它們沒有多大價值 - 代碼在部署後不會更改。
當然 - 它由你 - 如果你這樣做對生產系統的測試看到了價值,請便。
它比你想象的更簡單。在桌面上本地運行Selenium,確保phpunit在遠程服務器上安裝。然後在SSH連接中啓動一個反向SSH隧道。這取決於您的SSH客戶端。在PuTTY中,有一個SSH隧道設置,您可以通過選擇遠程選項來反轉方向。詳情請查閱this page。隨着命令行的OpenSSH,其做過這樣的:
ssh -R 4444:localhost:4444 [email protected]
這將監聽端口4444的遠程服務器上,並將其轉發給您的硒服務器桌面端口上的本地主機上運行4444
一旦你這樣做,你需要改變TEST_BASE_URL設置在yourproject /保護/測試/ WebTestCase.php去到遠程服務器的URL爲您警予的項目。
在Windows客戶端上從另一個代理機器運行gui測試的最簡單方法是使用「psexec」(http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx)。
- 1. 如何在PHPUnit + Selenium中運行測試?
- 2. 如何通過Jenkins運行phpunit測試時設置$ _SERVER ['']變量
- 3. PHPUnit - 通過命令行測試運行器運行特定測試套件
- 4. selenium無服務器通過SSH運行
- 5. 如果Selenium服務器未運行,如何跳過PHPUnit中的測試?
- 6. 運行測試NG硒測試通過SSH
- 7. 開發PHPUnit:如何運行測試
- 8. 如何在Windows中運行PHPUnit測試?
- 9. 如何使用Ruby測試SSH連接
- 10. 通過SSH隧道連接到通過YARN運行的Spark
- 11. 運行Selenium測試
- 12. Phpunit未運行Symfony測試
- 13. 如何通過SSH在RHEL服務器上運行selenium?
- 14. Ansible playbook測試SSH連接
- 15. 如何通過ssh運行Java框架
- 16. 如何遠程運行Selenium RC + PHPUnit + NetBeans?
- 17. 如何讓PHPUnit + Selenium運行得更快?
- 18. 如何在運行中更改PhpUnit測試的數據庫連接
- 19. PHPUnit和Selenium - 從另一個類運行測試
- 20. Selenium/PHPUnit測試總是運行兩次,第二次失敗
- 21. PHPUnit和Selenium Webdriver - 獲取不同的測試類併發運行
- 22. 如何在Jenkins中運行Selenium測試
- 23. 想法如何運行Selenium測試
- 24. 如何從Netbeans運行Selenium測試
- 25. 如何在browserstack.com上運行selenium測試?
- 26. TideSDK php通過ssh連接
- 27. SSH通過Telnet連接
- 28. 通過代理連接SSH
- 29. 通過SSH進行SSH(或如何通過SSH「通過SSH進行通信」)
當你問這些問題時,你需要提供更多的細節。 您是否試圖在運行Linux的本地機器上運行單元測試?如果是這樣,你想在xterm或從「文本」控制檯執行它嗎?或者,您是否可能通過ssh登錄到其他Linux主機? – 2010-10-22 14:33:45
我試圖通過ssh在只有Bash的CentOS服務器上執行它,如果可能的話。我在Yii書上關注敏捷開發,並在服務器上使用硒。我在Windows 7上建立了一個本地環境,但實際上並沒有看到除了生產環境之外的其他任何環境的測試點。也許硒以外的東西應該做的伎倆? – steve76 2010-10-22 21:03:28
爲了清晰起見,我冒昧地編輯了你的問題,希望你不要介意。 – 2010-10-23 08:11:50