Продолжая мой предыдущий пост, я думаю, что я узнал несколько новых (и захватывающих) вещей о 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<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
job
id
=
"testJob"
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 the
processor.
Depending on the checkpoint-policy, a collection of processed
items are then passed to the writer, to be written. And then
transaction commit.
Please note in this case since the checkpoint-policy is set to
'item' and item-count="1", it means that each item processed is
to 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
Это очень простой пример, который просто возвращаетInteger
до 100. Но это может быть намного сложнее, чем, например, чтение файла и т. Д.0102030405060708091011121314151617181920package
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
;
@Override
public
Object readItem()
throws
Exception {
while
(
this
.counter < MAX_COUNTER) {
++
this
.counter;
return
this
.counter;
}
return
null
;
}
}
-
TestBatchProcessor.java
. Ничего не делать01020304050607080910111213package
id.co.lucyana.hr.batch;
import
javax.batch.api.chunk.ItemProcessor;
import
javax.inject.Named;
@Named
public
final
class
TestBatchProcessor
implements
ItemProcessor {
@Override
public
Object processItem(Object item)
throws
Exception {
return
item;
// do nothing here
}
}
-
TestBatchWriter.java
. Опять же, этот может быть очень сложным, например, запись в основное хранилище данных и т. Д.01020304050607080910111213141516package
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 {
@Override
public
void
writeItems(List items)
throws
Exception {
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
|
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, получающая имя задания в качестве параметра
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
|
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, Хамелеон, Графен, Дрон, Селен
Теперь, после всех этих разработок, пришло время протестировать то, что мы написали, и мы собираемся протестировать это на реально работающем сервере приложений.
Первое, что нам нужно сделать, это настроить 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
|
<? 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
(который находится под вашим test/resources
если вы используете Maven) следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<? xml version = "1.0" encoding = "UTF-8" ?> 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, передавая имя задания для запуска пакетного задания. НО , мы хотим закодировать его как тест 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
|
<? xml version = "1.0" encoding = "UTF-8" ?> <!-- omitted --> < extension qualifier = "webdriver" > <!--<property name="browser">firefox</property>--> < property name = "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
|
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 { @Drone private WebDriver driver; @Deployment public static Archive<?> createTestArchive() { // just add classes required in your test final 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; } @Before public void beforeEachTest() { this .driver.manage().deleteAllCookies(); } /* * So that we do not hard-code the URL, simply use @ArquillianResource */ @Test @RunAsClient public 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 ).
Результат
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 г.