2013-05-16 87 views
4

正如標題所說,我對使用Jetty Web服務器測試應用程序的最佳方法感興趣,並考慮到您不想爲每個特定測試啓動/停止測試服務器。使用Web服務器運行集成測試的最佳方式是什麼?

據我所知,這些都是解決方案:

  1. ,如果你使用像Maven的或搖籃構建工具,你可以在*.pom*.gradle文件做到這一點。

    • 這樣做的缺點是您必須以不同的方式創建測試服務器,而您通常在應用程序中執行此操作。
  2. 創建一個測試套件,並使用@BeforeClass@AfterClass註釋啓動/停止前/服務器測試Suite後。

    • 缺點在於指定測試運行的「醜陋」方式。您還必須指定添加到套件的測試,它不應該在套件外運行(避免重複運行測試)。我認爲Junit還沒有完全配備這個。
  3. 創建,並在試驗開始啓動服務器以靜態方式,並使用ShutDown機制在JVM掛鉤,當所有的測試完成後自動停止服務器。這似乎是最好的解決方案,因爲這種機制已經在Jetty中可用,但是

    • 缺點是您無法控制服務器的停止。它是在一個完全不同的線程實際完成的,即使外面的建築工具的(我用搖籃本)

回答

5

我們做#2的幾乎所有我們的測試在碼頭本身。創建一個嵌入式服務器並部署一個應用程序,一個servlet或者任何你喜歡的東西真的很容易。這使您不僅可以運行自動化測試,而且還可以簡單地在IDE中調試應用程序,而無需IDE的所有工具開銷。所以從Jetty的角度來看,我們是在測試中創建測試套件並根據需要啓動和停止服務器的忠實粉絲。我們有測試案例,我們啓動多臺服務器並測試它們之間的會話到期時間,其他時間我們啓動一臺服務器,並使用我們的異步jetty客戶端來拋棄10k客戶端連接。只需運行jetty的完整版本即可啓動並停止數百個碼頭服務器實例。

不是每個應用都可以這樣連接起來,有些有外部數據庫需求等,但即使在那裏,您也經常有能力針對像德比這樣的內存數據庫編寫單元測試,這是劃分您的試驗。如果你絕對需要一個運行測試的環境,那麼很多人都會碰到maven,jetty-maven-plugin和硒之類的東西,但我通常認爲這些是更多的功能測試,或者驗收測試場景,實際的單元測試應該是至少在聯合測試的範圍內完成......至少。

+0

如何指定在一個套件運行測試?使用套件上的'@ SuiteClasses'註釋還是動態方法?此外,當您從IDE運行junit測試時,除了套件外,實際測試還將再次運行。你如何忽略實際測試,以便不再運行?感謝你的回答! – Mircea

+0

在jetty中,我們的測試只需使用@Test進行註釋,並遵循FooTest.class的命名約定,然後使用maven surefire插件在正常構建期間運行它們。在像eclipse這樣的IDE中,你可以運行單獨的測試,或者你可以運行測試目錄。如果你有測試運行兩次,我會說這是IDE本身的配置問題,而不是任何事情。 –

+0

可能是因爲我不夠明確。當我說Suite時,我指的是'org.junit.runners.Suite'。如果你創建一個測試與此批註,則您必須指定'org.junit.runners.Suite.SuiteClasses'註釋,其中包括要添加到'org.junit.runners.Suite'的測試類。只要指定的測試類只是正常的junit4測試類,即使它們是從maven運行的,它們也會運行。 Maven不知道這些測試類是在'org.junit.runners.Suite'註釋中定義的,並且也將由那個junit運行器運行。 – Mircea

1

我們使用詹金斯使用Build Pipeline Plugin建管道。第一份工作啓動構建並創建一個工件,其中包含所有已編譯的代碼,包括WAR文件和所有已編譯的測試代碼。

然後,下游作業拉開序幕其部署WAR文件到現場Tomcat服務器。

隨後我們有運行集成測試(獲得從上游構建的測試工件測試)對現場Tomcat服務器的工作。

還有比這更給它,但這是一般的想法。

相關問題