日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

發(fā)布時(shí)間:2023/12/3 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java EE 6测试第二部分– Arquillian和ShrinkWrap简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在Java EE 6測試的第一部分中,我簡要介紹了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API,以演示如何啟動該容器,如何在項(xiàng)目類路徑中查找bean以及運(yùn)行非常簡單的集成測試。

這篇文章重點(diǎn)介紹Arquillian和ShrinkWrap以及為什么它們是用于企業(yè)Java應(yīng)用程序集成測試的出色工具。

可以在GitHub上的arquillian-shrinkwrap文件夾下找到用于本文的源代碼。

工具

Arquillian
Arquillian將測試執(zhí)行帶到目標(biāo)運(yùn)行時(shí),從而減輕了開發(fā)人員從測試或項(xiàng)目構(gòu)建中管理運(yùn)行時(shí)的負(fù)擔(dān)。 要反轉(zhuǎn)此控件,Arquillian將生命周期包裝在執(zhí)行以下操作的測試執(zhí)行周圍:
  • 管理一個(gè)或多個(gè)容器的生命周期
  • 將測試用例,相關(guān)類和資源捆綁為ShrinkWrap檔案
  • 將檔案部署到容器
  • 通過依賴注入和其他聲明式服務(wù)豐富測試用例
  • 在容器內(nèi)部(或針對容器)執(zhí)行測試
  • 將結(jié)果返回給測試跑步者進(jìn)行報(bào)告

收縮包裝

ShrinkWrap是Arquillian的核心組件,它提供了一種簡單的機(jī)制,可以使用友好,流利的API來組裝JAR,WAR和EAR等檔案。

使用Arquillian的主要好處之一是,您可以在遠(yuǎn)程容器(即應(yīng)用程序服務(wù)器)中運(yùn)行測試。 這意味著您將測試真實(shí)的交易 。 沒有嘲笑。 甚至沒有嵌入式運(yùn)行時(shí)!

議程

這篇文章將涵蓋以下主題:

  • 在基于Maven的Java項(xiàng)目中配置Arquillian基礎(chǔ)架構(gòu)
  • 直接在測試實(shí)例中注入EJB和受管Bean(CDI)
  • 測試Java持久性API(JPA)層
  • 在客戶端模式下運(yùn)行Arquillian
  • 在IDE中運(yùn)行和調(diào)試Arquillian測試

配置Maven以運(yùn)行集成測試

要使用Maven運(yùn)行集成測試,我們需要一種不同的方法。 通過不同的方法,我指的是一個(gè)不同的插件: Maven故障安全插件 。

故障安全插件是Maven Surefire插件的分支,旨在運(yùn)行集成測試。

Failsafe插件目標(biāo)旨在在集成測試階段的程序包階段之后運(yùn)行。

Maven生命周期有四個(gè)運(yùn)行集成測試的階段:

  • 集成前測試:在此階段,我們可以啟動任何必需的服務(wù)或執(zhí)行任何操作,例如啟動數(shù)據(jù)庫或啟動Web服務(wù)器,等等。
  • 集成測試:故障安全將在此階段運(yùn)行測試,因此在所有必需的服務(wù)啟動之后。
  • 集成后測試:關(guān)閉所有服務(wù)的時(shí)間…
  • 驗(yàn)證: failsafe運(yùn)行另一個(gè)在此處解釋測試結(jié)果的目標(biāo),如果沒有通過任何測試,failsafe將顯示結(jié)果并退出構(gòu)建。

在POM中配置故障保護(hù):

<!-- clip --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.12</version><configuration><skipTests>true</skipTests></configuration> </plugin> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-failsafe-plugin</artifactId><version>2.12</version><configuration><encoding>UTF-8</encoding></configuration><executions><execution><id>integration-test</id><goals><goal>integration-test</goal></goals></execution><execution><id>verify</id><goals><goal>verify</goal></goals></execution></executions> </plugin> <!-- clip -->

默認(rèn)情況下,Surefire插件執(zhí)行**/Test*.java , **/*Test.java和**/*TestCase.java測試類。 Failsafe插件將查找**/IT*.java , **/*IT.java和**/*ITCase.java 。 如果同時(shí)使用Surefire和Failsafe插件,請確保使用此命名約定,以使其更容易識別哪個(gè)插件正在執(zhí)行哪些測試。

在Maven中配置Arquillian基礎(chǔ)架構(gòu)

通過附加以下XML片段,將Maven項(xiàng)目描述符配置為使用Arquillian:

<!-- clip --> <repositories><repository><id>jboss-public-repository-group</id><name>JBoss Public Repository Group</name><url>http://repository.jboss.org/nexus/content/groups/public/</url></repository> </repositories><dependencyManagement><dependencies><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>1.0.1.Final</version><scope>import</scope><type>pom</type></dependency></dependencies> </dependencyManagement><dependencies><dependency><groupId>org.jboss.arquillian.testng</groupId><artifactId>arquillian-testng-container</artifactId><scope>test</scope></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.4</version><scope>test</scope></dependency><dependency><groupId>org.jboss.spec</groupId><artifactId>jboss-javaee-6.0</artifactId><version>3.0.1.Final</version><scope>provided</scope><type>pom</type></dependency> </dependencies><profiles><profile><id>jbossas-remote-7</id><activation><activeByDefault>true</activeByDefault></activation><dependencies><dependency><groupId>org.jboss.as</groupId><artifactId>jboss-as-arquillian-container-remote</artifactId><version>7.1.1.Final</version><scope>test</scope></dependency></dependencies></profile> </profiles> <!-- clip -->

Arquillian有大量的容器適配器 。 Arquillian測試可以在與測試中使用的編程模型兼容的任何容器中執(zhí)行。 但是,在本文中,僅使用JBoss AS 7。
與Java EE 6測試第I部分類似,我選擇使用TestNG測試框架,但同樣, JUnit應(yīng)該也能正常工作。

創(chuàng)建可測試的組件

在研究如何使用Arquillian編寫集成測試之前,我們首先需要有一個(gè)要測試的組件。
會話Bean是Java EE堆棧中的常見組件,將用作測試主題。 在本文中,我將創(chuàng)建一個(gè)非常基本的后端,用于向數(shù)據(jù)庫中添加新用戶。

@Stateless public class UserServiceBean {@PersistenceContextprivate EntityManager em;public User addUser(User user) {em.persist(user);return user;}// Annotation says that we do not need to open a transaction@TransactionAttribute(TransactionAttributeType.SUPPORTS)public User findUserById(Long id) {return em.find(User.class, id);} }

在上面的代碼中,我使用JPA ,因此我們需要一個(gè)持久性單元。
持久性單元定義由應(yīng)用程序中的EntityManager實(shí)例管理的所有實(shí)體類的集合。 這組實(shí)體類表示單個(gè)數(shù)據(jù)存儲中包含的數(shù)據(jù)。 持久性單元由persistence.xml配置文件定義:

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"version="2.0"><persistence-unit name="example"><jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source><properties><property name="hibernate.hbm2ddl.auto" value="create-drop" /><property name="hibernate.show_sql" value="true" /></properties></persistence-unit> </persistence>

在本示例中,我使用的示例數(shù)據(jù)源使用H2數(shù)據(jù)庫,并且已經(jīng)使用JBoss AS 7進(jìn)行了配置。

最后,我們還需要一個(gè)映射到數(shù)據(jù)庫表的實(shí)體:

@Entity public class User {@Id@GeneratedValueprivate Long id;@NotNullprivate String name;// Removed constructors, getters and setters for brevity@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + "]";} }

使用Arquillian測試JPA

現(xiàn)在,我們都準(zhǔn)備編寫我們的第一個(gè)Arquillian測試。
Arquillian測試用例看上去就像帶有一些額外功能的單元測試。 它必須具有三件事:

  • 擴(kuò)展Arquillian類(這特定于TestNG,對于JUnit,您需要在類上使用@RunWith(Arquillian.class)批注)
  • 用@Deployment注釋的公共靜態(tài)方法,該方法返回ShrinkWrap存檔
  • 至少一種用@Test注釋的方法
public class UserServiceBeanIT extends Arquillian {private static final Logger LOGGER = Logger.getLogger(UserServiceBeanIT.class.getName());@Injectprivate UserServiceBean service;@Deploymentpublic static JavaArchive createTestableDeployment() {final JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "example.jar").addClasses(User.class, UserServiceBean.class).addAsManifestResource("META-INF/persistence.xml", "persistence.xml")// Enable CDI.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));LOGGER.info(jar.toString(Formatters.VERBOSE));return jar;}@Testpublic void callServiceToAddNewUserToDB() {final User user = new User("Ike");service.addUser(user);assertNotNull(user.getId(), "User id should not be null!");} }

該測試非常簡單,它插入一個(gè)新用戶并檢查id屬性是否已被數(shù)據(jù)庫生成的值填充。
由于Arquillian豐富了該測試,因此通常可以使用@EJB或@Inject批注來注入EJB和受管bean。
用@Deployment注釋的方法使用ShrinkWrap來構(gòu)建一個(gè)JAR歸檔文件,該歸檔文件將部署到容器中并對其進(jìn)行測試。 ShrinkWrap將測試所需的類和資源與類路徑的其余部分隔離開來,您應(yīng)該包括測試所需的每個(gè)組件才能在部署存檔中運(yùn)行。

客戶端模式

Arquillian支持三種測試運(yùn)行模式:

  • 容器內(nèi)模式用于測試您的應(yīng)用程序內(nèi)部。 這使Arquillian能夠與測試進(jìn)行通信,豐富測試并遠(yuǎn)程運(yùn)行測試。 在這種模式下,測試在遠(yuǎn)程容器中執(zhí)行; Arquillian默認(rèn)使用此模式。
  • 客戶端模式用于測試客戶端如何使用您的應(yīng)用程序。 與容器內(nèi)模式重新打包并覆蓋測試執(zhí)行相反,客戶端模式的作用盡可能小。 它不會重新打包@Deployment也不會將測試執(zhí)行轉(zhuǎn)發(fā)到遠(yuǎn)程服務(wù)器。 您的測試用例正在JVM中按預(yù)期運(yùn)行,并且您可以自由地從外部測試容器,如客戶所見。 Arquillian唯一要做的就是控制@Deployment的生命周期。
  • 混合模式允許在同一測試類中混合兩種運(yùn)行模式。

要以客戶端模式運(yùn)行Arquillian,首先要構(gòu)建要測試的servlet:

@WebServlet("/User") public class UserServlet extends HttpServlet {private static final long serialVersionUID = -7125652220750352874L;@Injectprivate UserServiceBean service;@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/plain");PrintWriter out = response.getWriter();out.println(service.addUser(new User("Ike")).toString());out.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {doGet(request, response);} }

現(xiàn)在讓我們測試一下:

public class UserServletIT extends Arquillian {private static final Logger LOGGER = Logger.getLogger(UserServletIT.class.getName());// Not managed, should be used for external calls (e.g. HTTP)@Deployment(testable = false)public static WebArchive createNotTestableDeployment() {final WebArchive war = ShrinkWrap.create(WebArchive.class, "example.war").addClasses(User.class, UserServiceBean.class, UserServlet.class).addAsResource("META-INF/persistence.xml")// Enable CDI.addAsWebInfResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));LOGGER.info(war.toString(Formatters.VERBOSE));return war;}@RunAsClient // Same as @Deployment(testable = false), should only be used in mixed mode@Test(dataProvider = Arquillian.ARQUILLIAN_DATA_PROVIDER)public void callServletToAddNewUserToDB(@ArquillianResource URL baseURL) throws IOException {// Servlet is listening at <context_path>/Userfinal URL url = new URL(baseURL, "User");final User user = new User(1L, "Ike");StringBuilder builder = new StringBuilder();BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));String line;while ((line = reader.readLine()) != null) {builder.append(line);}reader.close();assertEquals(builder.toString(), user.toString());} }

盡管此測試非常簡單,但它允許您通過單個(gè)方法調(diào)用來測試應(yīng)用程序的多個(gè)層。

在Eclipse中運(yùn)行測試

您可以從IDE內(nèi)部運(yùn)行Arquillian測試,就像單元測試一樣。

運(yùn)行Arquillian測試

(點(diǎn)擊圖片以放大)

  • 安裝TestNG和JBoss Tools Eclipse插件。
  • 將新的JBoss AS服務(wù)器添加到Eclipse:
  • 啟動JBoss AS服務(wù)器:
  • 從Eclipse運(yùn)行測試用例,右鍵單擊Project Explorer上的測試文件,然后選擇

Run As > TestNG Test :

結(jié)果應(yīng)類似于以下內(nèi)容:

調(diào)試Arquillian測試

(點(diǎn)擊圖片以放大)

由于我們使用的是遠(yuǎn)程容器,因此Debug As > TestNG Test不會導(dǎo)致斷點(diǎn)被激活。
相反,我們需要以調(diào)試模式啟動容器并附加調(diào)試器。 這是因?yàn)闇y試是在與原始測試運(yùn)行器不同的JVM中運(yùn)行的。 調(diào)試測試所需要做的唯一更改是在調(diào)試模式下啟動JBoss AS服務(wù)器:

  • 啟動JBoss AS服務(wù)器調(diào)試模式:
  • 將所需的斷點(diǎn)添加到代碼中。
  • 并通過右鍵單擊Project Explorer上的測試文件并選擇它來調(diào)試它

Run As > TestNG Test :

更多資源

我希望能夠強(qiáng)調(diào)Arquillian的一些好處。
有關(guān)Arquillian的更多信息,請查看以下資源:

  • Arquillian指南
  • Arquillian社區(qū)
  • Arquillian Git存儲庫

相關(guān)文章

  • 單元測試JBoss 5服務(wù)
  • Java EE 6測試第I部分– EJB 3.1可嵌入API
  • Maven 2 Cobertura插件–更新
  • JBoss PojoCache配置
  • JBoss AS 5.0已經(jīng)發(fā)布!
  • 上一篇文章:Java EE 6測試第I部分– EJB 3.1可嵌入API
  • 下一篇文章:比較OpenDDR與WURFL

參考: Java EE 6測試第II部分–來自我們JCG合作伙伴 Samuel Santos的Arquillian和ShrinkWrap簡介,位于Samaxes博客上。


翻譯自: https://www.javacodegeeks.com/2012/06/java-ee-6-testing-part-ii-introduction.html

總結(jié)

以上是生活随笔為你收集整理的Java EE 6测试第二部分– Arquillian和ShrinkWrap简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。