2. MOTIVAÇÃO
Permi(r
execução
dos
app+testes
(funcionais,
integração
e
de
unidade)
localmente.
FUNCIONAIS
Jenkins
rmi,webservice
JBOSS
localhost
Base
de
dados
Concorrência
entre
versões
do
sistema
em
QA
2
3. MOTIVAÇÃO
Focar
a
execução
dos
testes
em
parte
do
sistema.
APLICAÇÃO
Cache
Core
Config
Service
Offer
Persistence
WebServices
Web
Admin
Teste
Código
Testes
Deploy
3
4. Testes
de
Integração
Focados
na
comunicação
entre
componentes
e
recursos
Específicos
de
um
cenário
Sistema
B
A
fila
de
mensagens
Teste
• Tempo
de
execução
maior
que
base
de
testes
de
unidade,
entre
dados
segundos.
• Usam
mesmos
mocks,
mas
mocks
de
maior
tamanho.
4
5. (des)MOTIVAÇÃO
DEBUG
REMOTO
Problemas
de
concorrência
no
ambiente
*
Quanto
menos
debug,
melhor
5
6. OpenEJB
§ Desde
1999
§ Container
EJB
leve
§ Em
baixo
do
guarda-‐chuva
da
Apache
desde
2007
§ Suporte
a
várias
versões
da
especificação
EJB
§ 1.1,
2.0,
2.1,
3.0
e
parcialmente
3.1
§ Suporte
a
outras
especificações
como:
§ JAX-‐WS
§ JMS
§ JCA
6
7. OpenEJB
Implementação
da
especificação
EJB
presente
no
Apache
Gerônimo
Ajudaram
as
versões
da
especificação
EJB
evoluirem
O
Sucesso
veio
após
a
especificação
3.0
Possibilitar
incluir
EJBs
em
WARs
na
especificação
3.1
Algumas
contribuições
Do
OpenEJB
API
de
container
embu(do
na
versão
3.1
EJBContainer
container
=javax.ejb.embeddable.EJBContainer.createEJBContainer();
7
9. Injetando
componentes
@LocalClient
src/tests/resources/META-‐INF/ejb-‐jar.xml
public
class
SimpleTestWithInjec(on
{
<?xml
version="1.0"
encoding="UTF-‐8"?>
<ejb-‐jar
/>
@EJB
Habilita
Full-‐Scan
no
OpenEJB
private
TicketManager
(cketManager;
@Test
public
void
askTicketPriceShouldReturn90Cents()
throws
Excep(on
{
Proper(es
p
=
new
Proper(es();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.openejb.client.LocalIniHalContextFactory");
Context
context
=
new
Ini(alContext(p);
context.bind("inject",
this);
Money
money
=
(cketManager.getPriceForTicket("uol.(ckets.cloud");
assertEquals("R$
0.900000",
money.toString());
}
}
9
10. Criando
recursos
dentro
dos
testes
Permite
a
criação
de
qualquer
componente
dentro
do
testes:
Recursos
mais
interessantes:
– DataSources
– Connec(onFactory
– Queue,
Topic
– Mail
Session
Proper(es
p
=
new
Proper(es();
p.put("TechDayJTADataSource",
"new://Resource?type=DataSource");
p.put("TechDayJTADataSource.JdbcDriver",
"com.mysql.jdbc.Driver");
p.put("TechDayJTADataSource.JdbcUrl",
"jdbc:mysql://localhost:3306/techday");
p.put("TechDayJTADataSource.UserName",
"root");
p.put("TechDayJTADataSource.JtaManaged",
"true");
Proper(es
p
=
new
Proper(es();
p.put(”TicketPriceQueue",
"new://Resource?type=javax.jms.Queue");
p.put(”TicketPriceQueueResponse",
"new://Resource?type=javax.jms.Queue");
10
11. Adicionando
recursos
via
descritor
O
descritor
openejb.xml
permi(r
configurar
recursos
iniciados
junto
com
o
container.
<?xml
version="1.0"
encoding="UTF-‐8"?>
<openejb>
<Resource
id="TechDayJTADataSource"
type="DataSource">
JdbcDriver
com.mysql.jdbc.Driver
JdbcUrl
jdbc:mysql://localhost:3306/techday
UserName
root
JtaManaged
true
</Resource>
</openejb>
11
12. Persistência
dentro
dos
testes
Sempre
interagir
com
recursos
que
possuem
estado
conhecido.
@Before
public
void
setUp()
throws
Excep(on
{
Proper(es
p
=
new
Proper(es();
p.put("openejb.conf.file",
"src/test/resources/openejb.xml");
Context
context
=
new
Ini(alContext(p);
context.bind("inject",
this);
transacSonManager.begin();
}
@A{er
public
void
tearDown()
throws
Excep(on
{
transacSonManager.rollback();
}
12
13. ApplicaSon
Composer
Ajuda
a
focar
os
testes
somente
nas
classes
que
importam.
Era
u(lizado
internamente
para
testes
no
OpenEJB.
@LocalClient
@RunWith(ApplicaSonComposer.class)
public
class
TicketEn(tyIntegra(onTest
{
….
@Module
public
EjbJar
modulo()
{
EjbJar
Scket
=
new
EjbJar(”ScketManager");
Scket.addEnterpriseBean(new
StatelessBean(TicketManagerBean.class));
return
Scket;
}
@ConfiguraSon
public
Proper(es
config()
{
Proper(es
p
=
new
Proper(es();
p.put("TechDayJTADataSource",
"new://Resource?type=DataSource");
p.put("TechDayJTADataSource.JdbcDriver",
"com.mysql.jdbc.Driver");
p.put("TechDayJTADataSource.JdbcUrl",
"jdbc:mysql://localhost:3306/techday");
p.put("TechDayJTADataSource.UserName",
"root");
p.put("TechDayJTADataSource.JtaManaged",
"true");
return
p;
}
13
15. PROBLEMAS
Integração
com
outras
tecnologias
além
da
especificação
15
16. TomEE:
CDI,
EJB,
JPA,
JSF,
JSP,
JSTL,
JTA,
Servlet,
JavaMail,
Bean
Valida(on
TomEE+:
TomEE
+
JAX-‐RS,
JAX-‐WS,
JMS,
Connector
(JCA)
Outras
projetos
adicionados
ao
tomcat:
AcSveMQ,
CXF,
MyFaces,
OpenJPA,
OpenWebBeans
JelasSc:
primeira
empresa
de
PAAS
que
uSliza
o
TomEE
16
17. RESULTADO
Suite
com
centenas
de
testes
de
integração
roda
em
1
minuto,
interagindo
com
DAS
e
banco.
Podemos
debugar
localmente,
interagindo
com
ambientes
de
stage
e
qa
Permite
rodar
todos
os
testes
de
regressão
várias
vezes
por
dia
E
não
somente
na
fase
final
da
história.
17
18. Outra
opção
Extensões
para
Jboss
OSGI
Tomcat
CloudBees
Glassfish
TomEE
Resin
Je€y
Google
AppEngine
Weld
Spring
18
19. Diferenças
OpenEJB
embu(do
APP+TESTES
Container
copia
Arquillian
Servidor
de
Aplicação
APP+TESTES
ou
Container
19
20. @RunWith(Arquillian.class)
public
class
GerenciadorReservasTest
{
@EJB
private
GerenciadorReservas
reservas;
@Deployment
public
sta(c
JavaArchive
gerandoArquivoDeploy()
{
JavaArchive
arquivo
=
ShrinkWrap.create(JavaArchive.class);
arquivo.addPackages(true,
“uol.techday.(cketmanager”);
arquivo.addAsManifestResource(EmptyAsset.INSTANCE,
”ejb-‐jar.xml");
return
arquivo;
}
@Test
public
void
reservaDeveGerarCobranca()
throws
Excep(on
{
….
}
20
21. O
Arquillian
é
mais
flexível
que
o
OpenEJB
Mas
por
quê
não
usamos
os
Arquillian?
Projeto
recente,
depedências
em
ALPHA
Fácil
trocar
um
pelo
outro,
pois
o
OpenEJB
te
obriga
a
seguir
especificação
21