Продолжая мой предыдущий пост, я думаю, что я узнал несколько новых (и захватывающих) вещей о Java EE, а также об Arquillian и тестировании , и я хотел бы поделиться им с вами.
Но прежде чем мы начнем, я хотел бы сначала обратить ваше внимание на следующие моменты (это чисто мое мнение):
- В ожидании объявления Oracle о прекращении коммерческой поддержки Commercial, я думаю, я решил взглянуть на другой ведущий сервер приложений Java EE, Wildfly , и я был так рад, что сделал это.
-  В предыдущем посте я использовал для тестирования встроенную стеклянную рыбку.  Хотя встроенный Wildfly также доступен, я лично нахожу, что тестирование с использованием удаленного сервера приложений является «реальным» или приближает нас к моделированию реальной производственной среды.  Например, если я хочу протестировать свое приложение, которое работает на Wildfly 10 (который использует Java Mail, JMS), в данный момент указывает на базу данных 'xyz', все, что мне нужно сделать, это разархивировать ту же версию сервера приложений, которая использовалась в реальной среде (просто переименуйте его с-test) и укажите на другую копию базы данных'xyz'.
В любом случае, начнем.
В этом посте я расскажу следующее:
- Сценарий тестирования (охватывающий JAX-RS и JSR-352 Batch)
- Очень краткая настройка Wildfly
- Программирование JAX-RS и JSR-352 Batch
- Настройка Arquillian с помощью Chameleon (включая ShrinkWrap)
- Настройка Drone / Графен
Сценарий
  Тест состоит в том, чтобы вызвать веб-сервис RESTFUL, работающий на удаленном сервере Wildfly (который, в свою очередь, вызовет пакет JSR-352).  Но вместо того, чтобы тестировать его вручную, то есть открывать браузер или использовать curl , мы собираемся закодировать его как тест Арквилиана. 
Так что это довольно просто.
Установка 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 ( JBoss 2014 ). Возможно, я захочу использовать такую функцию, как JMS, поэтому для запуска полного профиля Java EE 7 выполните./bin/standalone.sh --server-config=standalone-full.xml
Разработать пакет JSR-352
Модель программирования JSR-352 Batch (называемая в этой статье Batch ) довольно обширна, но очень проста для понимания и использования. Но в основном вы можете либо следовать модели чтения-процесса-записи, либо модели пакетного развертывания самостоятельно ( Gupta 2013 ). Но для получения более подробной информации вы можете обратиться к руководству по Oracle здесь . (Каннан 2013).
В этом примере я проведу вас через очень простую серию операций чтения-процесса-записи.
Написать работу XML
-   Во-первых, создайте пустой beans.xmlдля включения CDI.
-   Во-вторых, вам нужно создать папку batch-jobsподMETA-INF. Если вы используетеmaven, то это идет подresources.
-   Под недавно созданным forder добавьте Job XML.  Обратите внимание, что по соглашению имя пакетного задания — это не что иное, как имя файла JSL XML, за исключением расширения .xml ( Kannan 2013 ).  Итак, допустим, мы называем это testJob.xml.
-   testJob.xmlКомментарии чередуются.0102030405060708091011121314151617181920212223242526272829<?xmlversion="1.0"encoding="UTF-8"?><jobid="testJob"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"version="1.0"><stepid="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.--><chunkcheckpoint-policy="item"item-count="1"><readerref="testBatchReader"/><processorref="testBatchProcessor"/><writerref="testBatchWriter"/></chunk></step></job>
Написать пакетного считывателя, процессора и записи
-   TestBatchReader.java. Пакетная обработка прекратит обработку, когда считыватель вернетnullЭто очень простой пример, который просто возвращаетIntegerдо 100. Но это может быть намного сложнее, чем, например, чтение файла и т. Д.0102030405060708091011121314151617181920packageid.co.lucyana.hr.batch;importjavax.batch.api.chunk.AbstractItemReader;importjavax.inject.Named;@NamedpublicfinalclassTestBatchReaderextendsAbstractItemReader {privateintcounter =0;privatestaticfinalintMAX_COUNTER =100;@OverridepublicObject readItem()throwsException {while(this.counter < MAX_COUNTER) {++this.counter;returnthis.counter;}returnnull;}}
-   TestBatchProcessor.java. Ничего не делать01020304050607080910111213packageid.co.lucyana.hr.batch;importjavax.batch.api.chunk.ItemProcessor;importjavax.inject.Named;@NamedpublicfinalclassTestBatchProcessorimplementsItemProcessor {@OverridepublicObject processItem(Object item)throwsException {returnitem;// do nothing here}}
-   TestBatchWriter.java. Опять же, этот может быть очень сложным, например, запись в основное хранилище данных и т. Д.01020304050607080910111213141516packageid.co.lucyana.hr.batch;importjava.util.List;importjava.util.logging.Level;importjava.util.logging.Logger;importjavax.batch.api.chunk.AbstractItemWriter;importjavax.inject.Named;@NamedpublicfinalclassTestBatchWriterextendsAbstractItemWriter {@OverridepublicvoidwriteItems(List items)throwsException {Logger.getLogger(TestBatchWriter.class.getName()).log(Level.INFO, items.toString());}}
Это для вашего пакетного программирования. Теперь давайте начнем с JAX-RS для запуска Batch.
Разработайте веб-сервис Restful
JAX-RS уже давно, поэтому я не буду утомлять вас подробностями. Но в основном все, чего мы хотим достичь — это иметь возможность вызывать веб-службу Restful с именем задания в качестве параметра для запуска пакетного процесса.
  Это ApplicationPath 
| 1 2 3 4 5 6 7 8 | packageid.co.lucyana.hr.util;importjavax.ws.rs.ApplicationPath;importjavax.ws.rs.core.Application;@ApplicationPath(value = "resources")publicclassApplicationConfig extendsApplication {} | 
И это конечная точка JAX-RS, получающая имя задания в качестве параметра
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | packageid.co.lucyana.hr.batch;importjava.util.Properties;importjava.util.logging.Level;importjava.util.logging.Logger;importjavax.batch.operations.JobSecurityException;importjavax.batch.operations.JobStartException;importjavax.batch.runtime.BatchRuntime;importjavax.ejb.LocalBean;importjavax.ejb.Singleton;importjavax.ws.rs.GET;importjavax.ws.rs.Path;importjavax.ws.rs.Produces;importjavax.ws.rs.QueryParam;@Singleton@LocalBean@Path(value = "batch")publicclassBatchManager {    @Path(value = "start")    @GET    @Produces(value = "application/json")    publiclongstart(@QueryParam("job") String job) {        Logger.getLogger(BatchManager.class.getName()).log(Level.INFO,                 BatchRuntime.getJobOperator().getJobNames().toString());        try{            returnBatchRuntime.getJobOperator().start(job, newProperties());        } catch(JobStartException | JobSecurityException e) {            Logger.getLogger(BatchManager.class.getName()).log(                    Level.SEVERE, e.getMessage(), e);            return-1l;        }    }} | 
Хорошо, теперь сделайте глубокий вдох … и ДАВАЙТЕ ТЕСТ !!!
Настройка Arquillian, Хамелеон, Графен, Дрон, Селен
Теперь, после всех этих разработок, пришло время протестировать то, что мы написали, и мы собираемся протестировать это на реально работающем сервере приложений.
Первое, что нам нужно сделать, это настроить Arquillian / Chameleon
Добавление Arquillian / Chameleon
  Если вы посмотрите на мой предыдущий пост , ссылаясь на pom.xml , вы можете заметить, что существует много информации относительно используемого контейнера, то есть org.jboss.arquillian.container и т. Д. Chameleon скрывает эту информацию и облегчает перемещение между контейнерами ( Knutsen 2015 ). 
  Поэтому изменения в моем pom.xml будут следующими. 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?xmlversion="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 (который находится под вашим test/resources если вы используете Maven) следующим образом: 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | <?xmlversion="1.0"encoding="UTF-8"?>            xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">    <defaultProtocoltype="Servlet 3.0"/>    <containerqualifier="wildfly"default="true">        <configuration>            <propertyname="chameleonTarget">wildfly:10.0.0.CR4:remote</property>            <propertyname="username"><!-- your username goes here --></property>            <propertyname="password"><!-- your password goes here --></property>        </configuration>    </container></arquillian> | 
Добавление графена / дрона / селена
  Теперь запомните, что мы пытаемся эмулировать, как если бы пользователь вводил URL-адрес для вызова веб-службы JAX-RS, передавая имя задания для запуска пакетного задания.  НО , мы хотим закодировать его как тест JUnit .  Для этого мы будем использовать комбинацию графена, дрона и селена.  Подробнее о них вы можете прочитать здесь .  Но в основном эти технологии являются частью тестовой платформы Arquillian, предназначенной для тестирования веб-интерфейса. 
  Сначала нам нужно изменить наш pom.xml и добавить следующее: 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <!-- 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 . 
| 1 2 3 4 5 6 7 | <?xmlversion="1.0"encoding="UTF-8"?>    <!-- omitted -->    <extensionqualifier="webdriver">       <!--<property name="browser">firefox</property>-->       <propertyname="remoteReusable">false</property>   </extension></arquillian> | 
NB Я не мог заставить ‘Firefox’ работать. По умолчанию это будет «htmlUnit» .
Все хорошо, последняя часть — написать настоящий тест по Арквилиану.
Напишите тестовый пример Arquillian
Первым делом первым делом мне нужно поделиться. И это для упаковки приложения в качестве EAR. Я попытался развернуть его как (EJB) JAR, JAX-RS не работает, а затем просто как WAR, Batch не работает. Итак, для целей этого тестирования я развернул как EAR, и все, кажется, счастливы ( Nozaki 2015 ).
Итак, давайте закодируем наш тест Arquillian. Комментарии чередуются.
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | packageid.co.lucyana.hr.batch;importid.co.lucyana.hr.util.ApplicationConfig;importjava.net.URL;importorg.jboss.arquillian.container.test.api.Deployment;importorg.jboss.arquillian.container.test.api.RunAsClient;importorg.jboss.arquillian.drone.api.annotation.Drone;importorg.jboss.arquillian.junit.Arquillian;importorg.jboss.arquillian.test.api.ArquillianResource;importorg.jboss.shrinkwrap.api.Archive;importorg.jboss.shrinkwrap.api.ArchivePaths;importorg.jboss.shrinkwrap.api.ShrinkWrap;importorg.jboss.shrinkwrap.api.spec.EnterpriseArchive;importorg.jboss.shrinkwrap.api.spec.JavaArchive;importorg.jboss.shrinkwrap.api.spec.WebArchive;importorg.junit.Assert;importorg.junit.Before;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.openqa.selenium.WebDriver;@RunWith(Arquillian.class)publicclassBatchManagerTest {    @Drone    privateWebDriver driver;    @Deployment    publicstaticArchive<?> createTestArchive() {        // just add classes required in your test        finalJavaArchive 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         */        finalWebArchive testWar = ShrinkWrap.create(                WebArchive.class, "test.war").addClass(BatchManagerTest.class);                finalEnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class)                .setApplicationXML("test-application.xml")                .addAsModule(ejbJar)                .addAsModule(testWar);        returnear;    }    @Before    publicvoidbeforeEachTest() {        this.driver.manage().deleteAllCookies();    }        /*     * So that we do not hard-code the URL, simply use @ArquillianResource     */    @Test    @RunAsClient    publicvoidshouldBeAble(@ArquillianResourceURL 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 ). 
Результат
  Yey !!!  Ну это все.  Убедитесь, что ваш Wildfly запущен и работает, теперь вы можете запустить тест.  Shrinkwrap упакует ваш EAR, затем Arquillian / Chameleon развернет его удаленно на работающем сервере Wildfly, затем в качестве клиента Drone / Graphene / Selenium вызовет URL-адрес для запуска пакета под названием testJob . 
Вот фрагмент результата остальных:
| 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 | 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 et al., 2014, «Функциональное тестирование с использованием Drone и Graphene» , Red Hat Inc., доступ 23 ноября 2015 г.
- Gupta, A, 2013, «Пакетные приложения в Java EE 7 — Общие понятия о JSR 352: TOTD # 192» , Oracle.com, доступ к которому 10 ноября 2015 года
- JBoss, 2014, «Руководство по началу работы — Wildfly 8» , JBoss.org, доступ 10 ноября 2015 г.
- Каннан, M, 2013, «Обзор пакетной обработки в Java EE 7.0» , Oracle.com, доступ 10 ноября 2015 г.
- Кнутсен, A, 2012, «@ArquillianResource java.net.URL, когда тест запускается на сервере» , JBoss Developer, доступ 23 ноября 2015 г.
- Кнутсен, A, 2015, «Блог Arquillian: Arquillian Container Chameleon 1.0.0.Alpha6 выпущен» , доступ к Red Hat Inc. 23 ноября 2015 года
- Nozaki, K, 2015, «Примеры тестирования Arquillian EJB-JAR / EAR» , блог Kohei Nozaki, доступ к которому 23 ноября 2015 года
- Oracle, 2013, «Обновление дорожной карты серверов Java EE и GlassFish» , Oracle.com, доступ 10 ноября 2015 г.