使用Chameleon,Shrinkwrap,Drone / Graphene与Arquillian进行Java EE集成测试
從我以前的帖子繼續在這里 ,我想我已經了解了Java EE和也的Arquillian,并測試了一些新的(和令人興奮的)事,我想與大家分享。
但是,在開始之前,我想首先請您注意以下幾點(這些純粹是我的觀點):
- 考慮到Oracle 宣布停止對Commercial的商業支持,我想我決定看一下另一個領先的Java EE應用服務器Wildfly ,我感到非常高興。
- 在上一篇文章中,我使用嵌入式glassfish進行測試。 盡管還提供嵌入式Wildfly,但我個人發現使用遠程應用程序服務器進行的測試是如此“真實” ,或者使我們更接近于模擬真實的生產環境。 僅作為示例,如果我要測試在Wildfly 10(使用Java Mail,JMS)上運行的應用程序,當前指向數據庫'xyz' ,我要做的就是解壓縮所使用的相同版本的應用程序服務器在實際環境中(只需使用-test重命名),然后指向'xyz'數據庫的另一個副本。
無論如何,讓我們開始吧。
在這篇文章中,我將介紹以下內容:
- 測試場景 (覆蓋JAX-RS和JSR-352批處理)
- 非常簡單的Wildfly設置
- 對JAX-RS和JSR-352批處理進行編程
- 使用變色龍設置Arquillian(包括ShrinkWrap)
- 設置無人機/石墨烯
該測試是要調用在遠程Wildfly上運行的RESTFUL Web服務(這又將調用JSR-352批處理)。 但是,與其手動進行測試(即打開瀏覽器或使用curl ,不如將其編碼為Arquillian測試。
因此,這很簡單。
安裝Wildfly
在撰寫本文時,我正在使用Wildfly 10 CR4。
- 只需將其下載到wildfly.org并解壓縮即可。
- 首先,您需要添加用戶。 因此,打開一個終端并導航到<unzip location>/bin/并運行./bin/add-user.sh 。 只需按照提示進行操作即可。
- 設置一個JAVA_HOME
- 首先,您需要添加用戶。 因此,打開一個終端并導航到<unzip location>/bin/并運行./bin/add-user.sh 。 只需按照提示進行操作即可。
- 要運行wildfly,只需運行./bin/standalone.sh 。 但是,請注意,默認情況下,Wildfly以Java EE 7 Web配置文件( JBoss 2014 )開頭。 我可能想使用JMS之類的功能,因此要啟動Java EE 7 Full Profile,請執行./bin/standalone.sh --server-config=standalone-full.xml
開發JSR-352批處理
JSR-352批處理(在本文中稱為“ 批處理 ”)編程模型非常廣泛,但理解和使用起來非常簡單。 但基本上,您可以遵循讀取過程寫入模型,也可以遵循自己的批次模型( Gupta 2013 )。 但是有關更多詳細信息,您可以在此處參考Oracle教程。 (Kannan 2013)。
在此示例中,我將引導您完成一個非常簡單的讀取過程寫入批處理。
- 首先,創建一個空的beans.xml以啟用CDI。
- 其次,您需要在META-INF下創建一個文件夾batch-jobs 。 如果您使用maven ,則這將歸入resources 。
- 在新創建的forder下,添加一個Job XML。 請注意,按照慣例,批處理作業的名稱就是作業JSL XML文件名,減去.xml擴展名( Kannan 2013 )。 因此,假設我們將其testJob.xml 。
- testJob.xml注釋是交錯的。 <?xml version="1.0" encoding="UTF-8"?> <job id="testJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"version="1.0"><step id="testStep"><!--Basically the way it works is this.A reader is executed to read an item, and then passed to theprocessor.Depending on the checkpoint-policy, a collection of processeditems are then passed to the writer, to be written. And thentransaction commit.Please note in this case since the checkpoint-policy is set to'item' and item-count="1", it means that each item processed isto be written and transactioni commit.--><chunk checkpoint-policy="item" item-count="1"><reader ref="testBatchReader" /><processor ref="testBatchProcessor" /><writer ref="testBatchWriter" /></chunk></step> </job>
- TestBatchReader.java 。 當讀者返回null時,批處理將停止處理。 這是一個非常簡單的示例,僅返回一個最大為100的Integer 。但是它可能比這復雜得多,例如讀取文件等。 package id.co.lucyana.hr.batch;import javax.batch.api.chunk.AbstractItemReader; import javax.inject.Named;@Named public final class TestBatchReader extends AbstractItemReader {private int counter = 0;private static final int MAX_COUNTER = 100;@Overridepublic Object readItem() throws Exception {while (this.counter < MAX_COUNTER) {++this.counter;return this.counter;}return null;} }
- TestBatchProcessor.java 。 沒做什么 package id.co.lucyana.hr.batch;import javax.batch.api.chunk.ItemProcessor; import javax.inject.Named;@Named public final class TestBatchProcessor implements ItemProcessor {@Overridepublic Object processItem(Object item) throws Exception {return item; // do nothing here} }
- TestBatchWriter.java 。 同樣,這可能非常復雜,例如寫入基礎數據存儲區等。 package id.co.lucyana.hr.batch;import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.batch.api.chunk.AbstractItemWriter; import javax.inject.Named;@Named public final class TestBatchWriter extends AbstractItemWriter {@Overridepublic void writeItems(List items) throws Exception {Logger.getLogger(TestBatchWriter.class.getName()).log(Level.INFO, items.toString());} }
這是用于您的批處理編程。 現在讓我們從JAX-RS開始,以觸發Batch運行。
開發一個寧靜的Web服務
JAX-RS已經有一段時間了,所以我不會為您帶來任何細節。 但是,基本上我們要實現的就是能夠調用Restful Web服務,并將作業名稱作為參數來觸發批處理。
這是ApplicationPath
package id.co.lucyana.hr.util;import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application;@ApplicationPath(value = "resources") public class ApplicationConfig extends Application { }并且,這是JAX-RS端點,接收作業名稱作為參數
package id.co.lucyana.hr.batch;import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.batch.operations.JobSecurityException; import javax.batch.operations.JobStartException; import javax.batch.runtime.BatchRuntime; import javax.ejb.LocalBean; import javax.ejb.Singleton; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam;@Singleton @LocalBean @Path(value = "batch") public class BatchManager {@Path(value = "start")@GET@Produces(value = "application/json")public long start(@QueryParam("job") String job) {Logger.getLogger(BatchManager.class.getName()).log(Level.INFO, BatchRuntime.getJobOperator().getJobNames().toString());try {return BatchRuntime.getJobOperator().start(job, new Properties());} catch (JobStartException | JobSecurityException e) {Logger.getLogger(BatchManager.class.getName()).log(Level.SEVERE, e.getMessage(), e);return -1l;}} }好吧,現在深吸一口氣……然后進行測試!!!
設置Arquillian,Chameleon,石墨烯,無人機,硒
在完成所有這些開發之后,現在該測試我們編寫的內容了,我們將在實際運行的應用程序服務器上對其進行測試。
我們要做的第一件事是設置Arquillian / Chameleon
如果您看一下我以前的文章 ,提到那里的pom.xml ,您可能會注意到,有很多有關散布在其中的容器的信息,例如org.jboss.arquillian.container等。Chameleon隱藏了這些信息,使在容器之間移動變得如此容易( Knutsen 2015 )。
因此,對我的pom.xml的更改如下。
<?xml version="1.0" encoding="UTF-8"?> <!-- omitted --><dependencyManagement><dependencies><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>1.1.8.Final</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.jboss.arquillian</groupId><artifactId>arquillian-bom</artifactId><version>1.1.9.Final</version><type>pom</type></dependency><dependency><groupId>org.jboss.arquillian.junit</groupId><artifactId>arquillian-junit-container</artifactId><scope>test</scope></dependency><dependency><groupId>org.arquillian.container</groupId><artifactId>arquillian-container-chameleon</artifactId><version>1.0.0.Alpha5</version><scope>test</scope></dependency></dependencies><!-- omitted -->并按以下方式配置arquillian.xml (如果使用Maven,則位于test/resources下):
<?xml version="1.0" encoding="UTF-8"?> <arquillian xmlns="http://jboss.org/schema/arquillian"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd"><defaultProtocol type="Servlet 3.0" /><container qualifier="wildfly" default="true"><configuration><property name="chameleonTarget">wildfly:10.0.0.CR4:remote</property><property name="username"><!-- your username goes here --></property><property name="password"><!-- your password goes here --></property></configuration></container> </arquillian>現在,記住我們試圖模擬的是,好像用戶輸入一個URL來調用JAX-RS Web服務,并傳遞一個作業名稱來啟動批處理作業。 但是 ,我們希望將其編碼為JUnit測試。 為此,我們將使用石墨烯,無人機和硒的組合。 您可以在此處閱讀有關它們的更多詳細信息。 但基本上,這些技術是Arquillian測試平臺的一部分,專門用于Web UI測試。
首先,我們需要修改pom.xml并添加以下內容:
<!-- omitted --><dependencyManagement><dependencies><!-- omitted --><dependency><groupId>org.jboss.arquillian.selenium</groupId><artifactId>selenium-bom</artifactId><version>2.43.1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies> <!-- Omitted --><dependency><groupId>org.jboss.arquillian.graphene</groupId><artifactId>graphene-webdriver</artifactId><version>2.0.3.Final</version><type>pom</type><scope>test</scope></dependency> <!-- omitted -->并在我們的arquillian.xml添加代碼段。
<?xml version="1.0" encoding="UTF-8"?><!-- omitted --><extension qualifier="webdriver"><!--<property name="browser">firefox</property>--><property name="remoteReusable">false</property></extension> </arquillian>注意:我無法使“ Firefox”正常工作。 因此,默認情況下為'htmlUnit' 。
一切都很好,最后一部分是編寫實際的Arquillian測試。
編寫Arquillian測試用例
首先,我需要分享。 那就是將應用程序打包為EAR。 我嘗試將其部署為(EJB)JAR,JAX-RS不起作用,然后僅作為WAR,Batch不起作用。 因此,出于該測試的目的,我以EAR的身份進行了部署,并且所有人似乎都很高興( Nozaki 2015 )。
因此,讓我們編寫Arquillian測試代碼。 評論交錯。
package id.co.lucyana.hr.batch;import id.co.lucyana.hr.util.ApplicationConfig; import java.net.URL; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.drone.api.annotation.Drone; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.WebDriver;@RunWith(Arquillian.class) public class BatchManagerTest {@Droneprivate WebDriver driver;@Deploymentpublic static Archive<?> createTestArchive() {// just add classes required in your testfinal JavaArchive ejbJar = ShrinkWrap.create(JavaArchive.class, "ejb-jar.jar").addClass(ApplicationConfig.class).addClass(BatchManager.class).addClass(TestBatchReader.class).addClass(TestBatchProcessor.class).addClass(TestBatchWriter.class).addAsManifestResource("test-persistence.xml",ArchivePaths.create("persistence.xml")).addAsManifestResource("META-INF/beans.xml", ArchivePaths.create("beans.xml")).addAsManifestResource("batch-jobs/testJob.xml").addAsResource("ValidationMessages.properties");/** Embedding war package which contains the test class is needed* So that Arquillian can invoke test class through its servlet* test runner*/final WebArchive testWar = ShrinkWrap.create(WebArchive.class, "test.war").addClass(BatchManagerTest.class);final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class).setApplicationXML("test-application.xml").addAsModule(ejbJar).addAsModule(testWar);return ear;}@Beforepublic void beforeEachTest() {this.driver.manage().deleteAllCookies();}/** So that we do not hard-code the URL, simply use @ArquillianResource*/@Test@RunAsClientpublic void shouldBeAble(@ArquillianResource URL url) {this.driver.get(url.toString() + "resources/batch/start?job=testJob");String pageSource = this.driver.getPageSource();System.out.println(pageSource);Assert.assertTrue(true);} }請注意@ArquillianResource的使用,它使我們不必對應用程序URL進行硬編碼( Knutsen 2012 )。
結果
是的! 就是這樣了。 確保已啟動并運行Wildfly,現在可以運行測試了。 Shrinkwrap將打包您的EAR,然后Arquillian / Chameleon將其遠程部署到正在運行的Wildfly服務器,然后作為客戶端 ,Drone / Graphene / Selenium將調用URL來運行名為testJob的批處理。
以下是其余結果的摘要:
18:07:00,585 INFO [org.jboss.as.server] (management-handler-thread - 2) WFLYSRV0010: Deployed "a3ee3dad-d71c-41b0-9f57-9ae6e7ffe859.ear" (runtime-name : "a3ee3dad-d71c-41b0-9f57-9ae6e7ffe859.ear") 18:07:06,137 INFO [id.co.lucyana.hr.batch.BatchManager] (default task-1) [] 18:07:06,332 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [1] 18:07:06,333 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [2] 18:07:06,333 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [3] 18:07:06,334 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [4] 18:07:06,334 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [5] 18:07:06,334 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [6] 18:07:06,334 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [7] 18:07:06,335 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [8] 18:07:06,335 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [9] 18:07:06,335 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [10] 18:07:06,335 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [11] 18:07:06,336 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [12] 18:07:06,336 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [13] 18:07:06,336 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [14] 18:07:06,336 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [15] 18:07:06,337 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [16] 18:07:06,337 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [17] 18:07:06,337 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [18] 18:07:06,337 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [19] 18:07:06,338 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [20] 18:07:06,338 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [21] 18:07:06,338 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [22] 18:07:06,338 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [23] 18:07:06,339 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [24] 18:07:06,339 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [25] 18:07:06,339 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [26] 18:07:06,339 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [27] 18:07:06,340 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [28] 18:07:06,340 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [29] 18:07:06,340 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [30] 18:07:06,340 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [31] 18:07:06,341 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [32] 18:07:06,341 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [33] 18:07:06,341 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [34] 18:07:06,341 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [35] 18:07:06,341 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [36] 18:07:06,342 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [37] 18:07:06,342 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [38] 18:07:06,342 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [39] 18:07:06,343 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [40] 18:07:06,343 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [41] 18:07:06,343 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [42] 18:07:06,344 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [43] 18:07:06,344 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [44] 18:07:06,344 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [45] 18:07:06,345 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [46] 18:07:06,345 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [47] 18:07:06,345 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [48] 18:07:06,345 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [49] 18:07:06,346 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [50] 18:07:06,346 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [51] 18:07:06,346 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [52] 18:07:06,347 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [53] 18:07:06,347 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [54] 18:07:06,347 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [55] 18:07:06,347 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [56] 18:07:06,348 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [57] 18:07:06,348 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [58] 18:07:06,348 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [59] 18:07:06,348 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [60] 18:07:06,349 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [61] 18:07:06,349 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [62] 18:07:06,349 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [63] 18:07:06,349 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [64] 18:07:06,349 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [65] 18:07:06,350 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [66] 18:07:06,350 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [67] 18:07:06,350 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [68] 18:07:06,350 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [69] 18:07:06,350 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [70] 18:07:06,351 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [71] 18:07:06,351 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [72] 18:07:06,351 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [73] 18:07:06,351 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [74] 18:07:06,352 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [75] 18:07:06,352 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [76] 18:07:06,352 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [77] 18:07:06,352 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [78] 18:07:06,352 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [79] 18:07:06,352 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [80] 18:07:06,353 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [81] 18:07:06,353 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [82] 18:07:06,353 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [83] 18:07:06,353 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [84] 18:07:06,353 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [85] 18:07:06,354 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [86] 18:07:06,354 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [87] 18:07:06,354 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [88] 18:07:06,354 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [89] 18:07:06,354 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [90] 18:07:06,355 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [91] 18:07:06,355 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [92] 18:07:06,355 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [93] 18:07:06,355 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [94] 18:07:06,356 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [95] 18:07:06,356 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [96] 18:07:06,356 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [97] 18:07:06,357 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [98] 18:07:06,357 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [99] 18:07:06,357 INFO [id.co.lucyana.hr.batch.TestBatchWriter] (Batch Thread - 1) [100] 18:07:06,885 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 72) WFLYUT0022: Unregistered web context: /test資源資源
- Allen等人,2014年, “使用無人機和石墨烯進行功能測試” ,紅帽公司,2015年11月23日訪問
- Gupta,A,2013年, “ Java EE 7中的批處理應用程序–理解JSR 352概念:TOTD#192” ,Oracle.com,2015年11月10日訪問
- JBoss,2014年, “入門指南– Wildfly 8” ,JBoss.org,2015年11月10日訪問
- 男,Kannan,2013年, “ Java EE 7.0中的批處理概述” ,Oracle.com,2015年11月10日訪問
- Knutsen,A,2012, “在服務器上運行測試時 , @ ArquillianResource java.net.URL” ,JBoss Developer,2015年11月23日訪問
- 納特森( Knutsen),A,2015年, “ Arquillian Blog:Arquillian Container Chameleon 1.0.0.Alpha6 Released” ,紅帽公司,2015年11月23日訪問
- Nozaki,K,2015年, “ Arquillian EJB-JAR / EAR測試示例” ,Kohei Nozaki的博客,2015年11月23日訪問
- Oracle,2013年, “ Java EE和GlassFish Server路線圖更新” ,Oracle.com,2015年11月10日訪問
翻譯自: https://www.javacodegeeks.com/2015/11/java-ee-integration-testing-arquillian-using-chameleon-shrinkwrap-dronegraphene.html
總結
以上是生活随笔為你收集整理的使用Chameleon,Shrinkwrap,Drone / Graphene与Arquillian进行Java EE集成测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 河南荥阳怎么读 河南荥阳的读音和介绍
- 下一篇: 盏组词语 盏组词语有哪些