最近,我有機會使用由我親愛的Holger Staudacher編寫的OSGi-JAX-RS-Connector庫。 通過連接器,您可以通過將@Path注釋的類型注冊為OSGi服務來輕松發布資源-實際上,它工作得很好。
對于我來說,使用普通的JUnit測試編寫驅動的服務類測試是很自然的事,但提供附加的集成測試也很重要。 這些測試允許檢查此類服務的運行時可用性和功能。 為了提供后者,我使用了Holger編寫的另一個小助手– restfuse ,它是用于自動HTTP / REST測試的JUnit擴展。
該場景看起來像這樣:
服務
@Path( '/message' )
public class SampleService {@GET@Produces( MediaType.TEXT_PLAIN )public String getMessage() {return 'Hello World';}
}
一個JUnit測試用例
public class SampleServiceTest {@Testpublic void testGetMessage() {SampleService service = new SampleService();String message = service.getMessage();assertEquals( 'Hello World', message );}
}
服務注冊
<?xml version='1.0' encoding='UTF-8'?>
<scr:componentxmlns:scr='http://www.osgi.org/xmlns/scr/v1.1.0'name='SampleService'><implementation class='sample.SampleService'/><service><provide interface='sample.SampleService'/></service>
</scr:component>
Restfuse集成測試
@RunWith( HttpJUnitRunner.class )
public class SampleServiceHttpTest {@Rulepublic Destination destination= new Destination( 'http://localhost:9092' );@Contextprivate Response response;@HttpTest( method = Method.GET, path = '/services/message' )public void checkMessage() {String body = response.getBody( String.class );assertOk( response );assertEquals( MediaType.TEXT_PLAIN, response.getType() );assertEquals( 'HelloWorld', body );}
}
正在運行的服務
盡管所有這些工作都非常簡單,但是它以某種方式使我感到困惑,即在我能夠執行集成測試之前,首先要在本地運行集成測試才能啟動服務器。 由于忙于手頭的任務,我經常忘記啟動服務器,遇到連接超時等問題。
但是我通過使用PDE JUnit啟動配置找到了解決方案,因為可以在運行測試的過程中將這樣的配置設置為啟動服務器。
為此,創建并選擇一個包含所有要運行1的集成測試的測試套件。
…之后切換到主標簽并選擇無頭模式...
…最后但并非最不重要的一點是配置服務器使用的程序參數,在我們的案例中,該參數主要涉及端口定義。
“插件”選項卡中的捆綁軟件選擇包含與用于獨立運行服務器的osgi啟動配置相同的捆綁軟件,以及JUnit,PDE JUnit,restfuse捆綁軟件及其依賴項。 所選的測試套件可能如下所示:
@RunWith( Suite.class )
@SuiteClasses( {SampleServiceHttpTest.class
} )
public class AllRestApiIntegrationTestSuite {public static String BASE_URL= 'http://localhost:'+ System.getProperty( 'org.osgi.service.http.port' );
}
唯一不尋常的是BASE_URL常量定義。 如上所述,測試運行的服務器端口在啟動配置中指定為程序參數。 但是Restfuse測試需要在目標規則定義期間提供端口。 使用上述方法可以在不影響測試的情況下更改配置中的端口。 只需將常量用作定義中的參數,如下面的代碼段2 3所示 。
@Rulepublic Destination destination= new Destination( BASE_URL );
這個簡單的設置效果很好,并改善了我在本地運行集成測試的工作流程。 將啟動配置保存在共享項目中后,您的團隊成員就可以輕松地重用啟動配置。
今天就這樣,反饋一如既往地受到高度贊賞。 順便說一句,霍爾格答應我寫一篇文章,介紹如何將上述內容集成到基于Maven / tycho的版本4中 -請繼續關注
- 當然,您也可以使用運行選定項目,程序包或源文件夾的所有測試的可能性,但是出于我們的目的,使用套件方法并運行單個測試用例是可以的
- 在現實世界中,您可能會為常量定義提供一個單獨的類,以避免將測試耦合到套件。 為了簡化起見,我在這里略過。
- 請注意,使用靜態導入包含BASE_URL,以提高代碼段的可讀性
- Holger信守諾言,請參閱: http : //eclipsesource.com/blogs/2012/09/11/running-httprest-integration-tests-in-an-eclipse-tycho-build/
參考:來自JCG合作伙伴 Frank Appel的Code Affine博客在Eclipse中有效地運行HTTP / REST集成測試 。
翻譯自: https://www.javacodegeeks.com/2012/11/running-httprest-integration-tests-efficiently-in-eclipse.html