使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql配置以及性能优化(转)

MySQL配置文件my.cnf中文详解&#xff0c;附mysql性能优化方法分享 Mysql参数优化对于新手来讲&#xff0c;是比较难懂的东西&#xff0c;其实这个参数优化&#xff0c;是个很复杂的东西&#xff0c;对于不同的网站&#xff0c;及其在线量&#xff0c;访问量&#xff0c;帖子数…

android+完美的列表,android完美讲义.pdf

android完美讲义王骋QQPhoneMail• 感谢我的同事&#xff0c;陈操(横拓开源技术副总)&#xff0c;在他提供的资料乊上做了迚一步总结提炼。• 参考资料android sdk开发文档&#xff0c;IBM开发者&#xff0c;同时也感谢网络上的各位大侠• 这个ppt更多是总结&#xff0c;侧重亍…

ios framework 找不到.h_找不到好看的壁纸?上万张「高清壁纸」,都在iOS捷径里...

所需工具&#xff1a;iOS捷径获取方法&#xff1a;后台私信回复「363」不和大家废话&#xff0c;今天给大家分享一个超好用的ios壁纸捷径&#xff0c;用了它之后再也不怕找不到喜欢的壁纸了~将克拉壁纸的捷径链接在Safari浏览器打开&#xff0c;就会自动跳转到一个获取捷径的窗…

12306余票查询

https://kyfw.12306.cn/otn/leftTicket/queryX?leftTicketDTO.train_date2017-04-02&leftTicketDTO.from_stationHXZ&leftTicketDTO.to_stationIZQ&purpose_codesADULT 转载于:https://www.cnblogs.com/jekaysnow/p/6657918.html

div内容用html语言写,html – 使用DIV作为另一个元素的背景

这里我用2个div做了一个例子&#xff1a;> .content,包含前端所需的一切> .background – 包含文本,图像和背景中的所有其他内容要将一个div包装在另一个div上(制作叠加层),你必须将它们放入相同的元素中,在本例中它是#wrapper div.放置位置&#xff1a;包装的相对宽度/高…

jetty 配置jndi_使用Jetty设置JNDI(嵌入式)

jetty 配置jndi我在开发工作区上运行嵌入式Jetty&#xff0c;从而节省了一些恶性的编译和部署周期。 我与Jetty的合作不多&#xff0c;易用性使我着迷于它。 我需要设置JNDI才能检索与数据库相关的活动的连接池。 尽管某些地方有完整的文档&#xff0c;但大多数都是分散的。 因…

auot lisp 选择集处理_离散量的计算机处理63_1Cv6

计算机语言运用--数值计算6-离散量的计算机处理63_1Cv6计算机&#xff1a;电子线路组成的计算机器。人与计算机则是通过计算机语言-符号系统说给计算机听而交流。计算机语言有低级语言-机器语言、汇编、高级语言-C/C/C#/VB/PASCAL/LISP/JAVA/PYTHON/……成百上千种之多。作为一…

bzoj 3928: [Cerc2014] Outer space invaders

$f[i][j]$表示消灭起始时间在$(i,j)$内的外星人所花费的最小代价。 考虑在这个区间内距离最远的外星人h&#xff0c;在他的区间中一定要选一个点要开一炮&#xff0c;而且这一炮可以顺便把其他跨过这个点的敌人消灭&#xff0c;剩下只需消灭没有跨过这个点的敌人。 枚举开炮时间…

HTML页面代码移动端和pc兼容,pc端网站如何实现移动端适配?

4、流动布局(fluidgrid)“流动布局”的含义是&#xff0c;各个区块的位置都是浮动的&#xff0c;不是固定不变的。.main{float:right;width:70%;}.leftBar{float:left;width:25%;}float的好处是&#xff0c;如果宽度太小&#xff0c;放不下两个元素&#xff0c;后面的元素会自动…

linkedblockingqueue 后 take 不消化_消化不良的成因及护理

疾病名称&#xff1a;消化不良就诊科室&#xff1a;消化内科疾病成因心理和精神的不良应激&#xff1a;患者的精神不愉快、长期闷闷不乐或突然受到猛烈的刺激等均可引起。不良饮食习惯&#xff1a;包括刺激性食物&#xff08;咖啡、浓茶、甜食、油腻、生冷等&#xff09;和不良…

功能与命令式编程。 Java 8中的斐波那契,素数和阶乘

有多种编程风格/范例&#xff0c;但是两种著名的风格是Imperative和Functional 。 命令式编程是最主要的范例&#xff0c;因为几乎所有主流语言&#xff08;C &#xff0c;Java&#xff0c;C&#xff03;&#xff09;都在推广它。 但是在最近几年中&#xff0c;函数式编程开始…

Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队

题目链接&#xff1a;点击传送D. Powerful arraytime limit per test5 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputAn array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, al  …

html 形状div,div+css实现各种形状(精心整理)

1.正方形.div {width: 100px;height: 100px;background: red;}2.矩形.div {width: 200px;height: 100px;background: red;}3.圆形.div {width: 100px;height: 100px;background: red;-moz-border-radius: 50px;-webkit-border-radius: 50px;border-radius: 50px;}4.椭圆.div {w…

4.1.5事件

用事件有一种监听的思想 一个事件对应一个委托 事件是委托类型 一个事件对应一个委托&#xff0c;委托可以对应多个方法 如气球爆炸了 气球的反应 小孩的反应 事件源有代码自动激发事件 扔出事件 —————————————— 3.只能在类的内部触发事件 4.可以在内部…

485不用双绞线可以吗_现在在上海,挡风玻璃可以一个标志都不用贴吗?

问近日&#xff0c;有市民咨询&#xff1a;现在在上海&#xff0c;车上挡风玻璃可以一个标志都不用贴吗&#xff1f;答可以一个标志都不贴。自2020年3月1日起&#xff0c;本市机动车在本市办理注册、变更、转移登记和核发检验标志、补换检验标志业务时&#xff0c;将自动生成检…

Java和Python中类似Kotlin的生成器,续:附加参数

介绍 在今天的文章中&#xff0c;我们将继续上周的文章&#xff0c;内容涉及用Java和Python制作类似于Kotlin的构建器&#xff0c;扩展构建器API以采用一些可选参数来提高灵活性。 我们继续我们HTML示例&#xff0c;尝试添加标记属性&#xff0c;例如类&#xff0c;id和样式。 …

vs2015 html页面没有试图,vs2015 web设计视图假死,求帮助

你好&#xff0c;首先&#xff0c;请在发送一个请求去验证你的MSDN账号。然后&#xff0c;从你的描述来看&#xff0c;即使创建新项目&#xff0c;VS的design界面出现不了还是你的VS安装有问题。我们可以从两方面考虑&#xff1a;1.系统环境建议你检查一下Windows系统更新&…

nodejs 之 nvm和pm2

说道 node不得不提到nodejs的版本管理nvm和Node应用的进程管理器pm2。 当然&#xff0c;关于这两个的介绍的文章那么多&#xff0c;随意baidu,bing,google就可以。 我这里是给自己打一个标签&#xff0c;方便日后 查询&#xff0c; 二是方便一些和我一样的小白&#xff0c;能速…

2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...

2018年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口2018年上饶高考结束了&#xff0c;可是上饶中考又来了!6月注定是一个不平淡的月份。又一大批孩子朝着青春出发踏着坚定的脚步&#xff0c;行走在如火的六月。宁静的清晨&#xff0c;静谧的夜&#xff0c;那条反反复复走…

vue 实例化几种方式_vue注册组件的几种方式总结

vue注册组件的几种方式总结 1、全局注册(这种方式注册组件必须在vue实例化之前声明) Vue.component(tag-name,{}) 2、局部注册 var Child = {template: A custom component! } new Vue({// ... components: {// 将只在父模板可用 my-component: Child } }) 3、扩展实例 // 定…