SlideShare ist ein Scribd-Unternehmen logo
1 von 240
Downloaden Sie, um offline zu lesen
Lidando com o Caos: testando
código PLSQL em projeto crítico
Preparar essa
palestra me trouxe
de volta um
sentimento…
INSEGURANÇA
parece bobagem, mas
não é…
Imagina entrar num
projeto…
CRÍTICO
PROJETO
Reestruturar Logistica
Integração de
vários sistemas
Prazo
Apertado
Onde você…
NADA do
NEGÓCIO
NEM dos
SISTEMAS
ENVOLVIDOS
Tabelas e mais Tabelas
Pra piorar…
Não
2006
2006+10 anos
Mas daí…
Me deram a BOA
Notícia!
Líder Técnico
E quando fomos
apresentados…
Olá, tudo bom? Meu nome Rafael. Novo
desenvolvedor no projeto.
Olá, tudo bom? Meu nome Rafael. Novo
desenvolvedor no projeto.
Opa, sou Dudu. O líder técnico do projeto.
Olá, tudo bom? Meu nome Rafael. Novo
desenvolvedor no projeto.
Opa, sou Dudu. O líder técnico do projeto.
300, viu?
Olá, tudo bom? Meu nome Rafael. Novo
desenvolvedor no projeto.
Opa, sou Dudu. O líder técnico do projeto.
300, viu?
ahn!!? 300? 300 o que?
Olá, tudo bom? Meu nome Rafael. Novo
desenvolvedor no projeto.
Opa, sou Dudu. O líder técnico do projeto.
300, viu?
ahn!!? 300? 300 o que?
R$300.000 por hora se o sistema
parar!
R$300k/h
E assim eu me senti
de novo…
ESTAGIÁRIO
Me veio vários
questionamentos…
Será que posso
ajudar no projeto?
Minha experiência
vai ajudar em algo?
Lidando com o Caos: testando
código PLSQL em projeto crítico
@rponte
Eduardo
Menezes
Lidando com o Caos: testando
código PLSQL em projeto crítico
Esclarecendo o que
o Rafael falou…
Líder Técnico
Líder Técnico
R$300k/h
Falei besteira pro
Rafael…
R$5.5mi/h
E a empresa na qual
rola o projeto é…
4.6bi/ano$ * Lucro Liquido - 2015
E este PROJETO tem
por finalidade…
Reestruturar Logistica
Utilizando
tecnologias como…
Mas sem dúvida…
Parte importante
dessa integração
ficou com…
Para quem não
conhece PL/SQL…
Integer tamanho(String texto) {
// retorna tamanho
return texto.length();
}
Java
function tamanho(texto varchar2)

return number is
begin
-- retorna tamanho
return lENGTH(texto);
end;
PL/SQL
Apesar de ser uma
linguagem simples
Quando o assunto é
PROCESSAR DADOS…
PODEROSA
Afinal…
function tamanho(texto varchar2)

return number is
begin
-- retorna tamanho
return lENGTH(texto);
end;
E na MDIAS
trabalhamos com
GRANDES VOLUMES
DE DADOS
Não dá pra
ignorar isso!
PERFORMANCE
Mas PL/SQL tem
seus problemas…
Milhares de Linhas
Fácil ter procedures
com 5-10k linhas de
código
Ferramentas Precárias
Esqueça IDEs
sofisticadas como
Eclipse
Regras de Negócio
Não tem a mesma
clareza de linguagens
OO
E isso era um grande
problema…
Regras de Negócio
Complexas
Pra piorar…
A metade da equipe
não dominava o
negócio
Agora imagina…
PL/SQL
PL/SQL
+
PL/SQL
+Regras 

Complexas
Batemos com 2
desafios sérios…
MANUTENÇÃO

do código
CORRETUDE 

das regras de negócio
CORRETUDE 

das regras de negócio
Como representar as
regras em código
corretamente?
Documentação
Quadro-branco
Programação em Par
Programação em Par
MANUTENÇÃO

do código
Como escrever código
de qualidade?
Como escrever código
fácil de ler e manter?
Guia de Estilo
Padronização do Código
Padronização ajuda;
estilo ajuda. Mas
precisamos ir mais
longe…
BEGIN
IF is_frete_calc(cliente) THEN

processa_entrega(cliente);
notifica_cliente(cliente);
END IF;
END;
Funções Pequenas
BEGIN
IF is_frete_calc(cliente) THEN

processa_entrega(cliente);
notifica_cliente(cliente);
END IF;
END;
Funções Pequenas
BEGIN
IF is_frete_calc(cliente) THEN

processa_entrega(cliente);
notifica_cliente(cliente);
END IF;
END;
Funções Pequenas
BEGIN
IF is_frete_calc(cliente) THEN

processa_entrega(cliente);
notifica_cliente(cliente);
END IF;
END;
Funções Pequenas
e claro…
BEGIN
IF is_frete_calc(cliente) THEN

processa_entrega(cliente);
notifica_cliente(cliente);
END IF;
END;
Funções Pequenas
comNOMESLEGÍVEIS!
BONS
NOMES
MAIOR
CLAREZA=
BONS
NOMES MENOS
COMENTÁRIOS
NO CÓDIGO
=
Só isso é suficiente?
Não
Precisamos
EXECUTAR o código
para ter certeza
Mas como executar?
Manualmente?
BEGIN


processa_entrega(cliente);
END;
ou…
Usa equipe de QA…
só que…
e ai?
Testes Automatizados
function tamanho(texto varchar2)

return number is
begin
-- retorna tamanho
return lENGTH(texto);
end;
Não existem boas
ferramentas de testes
Mas nosso time é…
function tamanho(texto varchar2)

return number is
begin
-- retorna tamanho
return lENGTH(texto);
end;
Executa procedure
Executa procedure
Devolve resultado
Executa procedure
Devolve resultado
PL/SQL
Calcular Frete
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
JAVA
Calcular Frete
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}”;
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}”;
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}”;
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.VARCHAR);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute();
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute(); // executa function
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute(); // executa function
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute(); // executa function
return cs.getDouble(1);
}
}
Java
jUnit
Testar Calcular Frete
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
jUnitclass FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
jUnit
Vamos complicar?
PL/SQL
Calcular Frete
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
-- Calcula Frete
function calc_frete(uf varchar2)

return number is
begin
if uf = 'SP' then
return 30.0;
end if;
return 20.20;
end;
PL/SQL
function calc_frete(uf varchar2)

return number is
begin
-- nova logica
end;
PL/SQL
MODELO
function calc_frete(uf varchar2) return number
is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
INTO valor_frete
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
end;
PL/SQL
function calc_frete(uf varchar2) return number
is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
end;
PL/SQL
function calc_frete(uf varchar2) return number
is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
end;
PL/SQL
function calc_frete(uf varchar2) return number
is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
INTO valor_frete
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
end;
PL/SQL
function calc_frete(uf varchar2) return number
is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
INTO valor_frete
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
end;
PL/SQL
function calc_frete(uf varchar2) return number
is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
INTO valor_frete
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
end;
PL/SQL
E o código Java?
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute(); // executa function
return cs.getDouble(1);
}
}
Java
class FreteService {
public Double calcula(String uf) {
String sql = "{? = call calc_frete(?)}";
Connection c = // abre conexão
CallableStatement cs = c.prepareCall(sql);
cs.registerOutParameter(1, Types.DOUBLE);
cs.setString(2, uf);
cs.execute(); // executa function
return cs.getDouble(1);
}
}
Java
Nada!
jUnit
Testar Calcular Frete
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
this.limpaEInsereFrete("SP", 30.0);
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
this.limpaEInsereFrete("SP", 30.0);
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
this.limpaEInsereFrete("SP", 30.0);
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
DELETEFROMTB_FRETE_VALOR;

INSERTINTO TB_FRETE_VALORVALUES(1,‘SP’,30.30);
class FreteServiceTest {
@Test
public void deveCalcularFrete() {
// cenário
String uf = "SP";
this.limpaEInsereFrete("SP", 30.0);
// ação
FreteService service = new FreteService();
double valor = service.calcula(uf);
// validação
assertEquals(30.0, valor);
}
}
jUnit
jUnit
E aí, tudo testado?
Mando pra produção?
E SEnão encontrar
a UF na tabela?
function calc_frete(uf varchar2) return number
is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
INTO valor_frete
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
end;
PL/SQL
function calc_frete(uf varchar2) return number is
valor_frete number;
begin
-- busca valor do frete na tabela
SELECT f.valor
INTO valor_frete
FROM TB_FRETE_VALOR f
WHERE f.uf_destino = uf;
return valor_frete;
EXCEPTION
WHEN no_data_found THEN
raise_application_error(-20200, ‘oops!’);
end;
PL/SQL
class FreteServiceTest {
@Test
public void
naoDeveCalcularFreteQuandoUfNaoEncontrada()
{
// lógica do teste vai aqui
}
}
jUnit
jUnit
jUnit
E SEencontrar
mais de um frete?
E SE…
Outros Cenários
Desafios
Desconfiança
Pair
Programming
Testes
Automatizados
O pior…
ATRASOU
mesmo!
Mas não foi à toa…
não tem LITERATURA
não tem COMUNIDADE
não tem CULTURA
Não se engane!
Tivemos bons
resultados!
Melhoramos
nosso processo
Simplificamos nosso
ambiente
Diminuimos o
indice de bugs
Não temos
MEDO de mexer
no código
Padronização da
Arquitetura dos testes
Agora a Gerência
gostou!!
e a partir de agora
novos projetos irão
adotar esta
metodologia
o que ficou faltando?
treinar restante da
equipe
Servidor
de
Integração
Cobrir procedures
IMPORTANTES com
testes
Bem…
O caminho é longo
Não será fácil…
Nem acontecerá da
noite pro dia…
Obrigado!
Eduardo Menezes

edumenezes@gmail.com
Rafael Ponte

rponte@gmail.com

Weitere ähnliche Inhalte

Was ist angesagt?

Testes de Software - Módulo 2
Testes de Software - Módulo 2Testes de Software - Módulo 2
Testes de Software - Módulo 2Rodrigo Paes
 
Aula01
Aula01Aula01
Aula01vdlos
 
A linguagem de programação c
A linguagem de programação cA linguagem de programação c
A linguagem de programação cClausia Antoneli
 
Desligar pc
Desligar pcDesligar pc
Desligar pcferbsi
 
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...Manuel Menezes de Sequeira
 
Visualg introdução aos algoritmos
Visualg introdução aos algoritmosVisualg introdução aos algoritmos
Visualg introdução aos algoritmosLuciano Júnior
 
Programação desktop - apresentação
Programação desktop -  apresentaçãoProgramação desktop -  apresentação
Programação desktop - apresentaçãoRosicleia Frasson
 
As cinco etapas da programação
As cinco etapas da programaçãoAs cinco etapas da programação
As cinco etapas da programaçãoClausia Antoneli
 
Programando em C++ // Estrutura Básica
Programando em C++ // Estrutura Básica Programando em C++ // Estrutura Básica
Programando em C++ // Estrutura Básica Yuri Camelo
 

Was ist angesagt? (15)

Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
 
Rel3-81715-81731-81138
Rel3-81715-81731-81138Rel3-81715-81731-81138
Rel3-81715-81731-81138
 
Testes de Software - Módulo 2
Testes de Software - Módulo 2Testes de Software - Módulo 2
Testes de Software - Módulo 2
 
Aula01
Aula01Aula01
Aula01
 
A linguagem de programação c
A linguagem de programação cA linguagem de programação c
A linguagem de programação c
 
Etapas da programação
Etapas da programaçãoEtapas da programação
Etapas da programação
 
Apostila visualgv25
Apostila visualgv25Apostila visualgv25
Apostila visualgv25
 
Desligar pc
Desligar pcDesligar pc
Desligar pc
 
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
 
Aula 05 subprogramas
Aula 05   subprogramasAula 05   subprogramas
Aula 05 subprogramas
 
Visualg introdução aos algoritmos
Visualg introdução aos algoritmosVisualg introdução aos algoritmos
Visualg introdução aos algoritmos
 
Comandos e expressões
Comandos e expressõesComandos e expressões
Comandos e expressões
 
Programação desktop - apresentação
Programação desktop -  apresentaçãoProgramação desktop -  apresentação
Programação desktop - apresentação
 
As cinco etapas da programação
As cinco etapas da programaçãoAs cinco etapas da programação
As cinco etapas da programação
 
Programando em C++ // Estrutura Básica
Programando em C++ // Estrutura Básica Programando em C++ // Estrutura Básica
Programando em C++ // Estrutura Básica
 

Andere mochten auch

Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016Rafael Ponte
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Rafael Ponte
 
Google AMP 1 an après : quel bilan, quelles perspectives ?
Google AMP 1 an après : quel bilan, quelles perspectives ?Google AMP 1 an après : quel bilan, quelles perspectives ?
Google AMP 1 an après : quel bilan, quelles perspectives ?Virginie Clève - largow ☕️
 
Ptsa201617.pdf
Ptsa201617.pdfPtsa201617.pdf
Ptsa201617.pdfwpwebsite
 
Actualizacion de recomendación sobre vacuna frente a tetanos
Actualizacion de recomendación sobre vacuna frente a tetanosActualizacion de recomendación sobre vacuna frente a tetanos
Actualizacion de recomendación sobre vacuna frente a tetanosIsmael Calcerrada Alises
 
English Grammar in Kurdish | ڕێزمانی ئینگلیزی
English Grammar in Kurdish | ڕێزمانی ئینگلیزیEnglish Grammar in Kurdish | ڕێزمانی ئینگلیزی
English Grammar in Kurdish | ڕێزمانی ئینگلیزیSarchia Khursheed
 
Engine de template em Javascript com HTML Sprites
Engine de template em Javascript com HTML SpritesEngine de template em Javascript com HTML Sprites
Engine de template em Javascript com HTML SpritesMilfont Consulting
 
The Soul in The Machine - Developing for Humans
The Soul in The Machine - Developing for HumansThe Soul in The Machine - Developing for Humans
The Soul in The Machine - Developing for HumansChristian Heilmann
 
2017 Edelman Trust Barometer - Brasil
2017 Edelman Trust Barometer - Brasil2017 Edelman Trust Barometer - Brasil
2017 Edelman Trust Barometer - BrasilEdelman
 
Psychologie van het motiveren met o.a. Dan Ariely
Psychologie van het motiveren met o.a. Dan ArielyPsychologie van het motiveren met o.a. Dan Ariely
Psychologie van het motiveren met o.a. Dan ArielyHans Janssen
 
DroidKaigi 2017 welcometalk DAY01
DroidKaigi 2017 welcometalk DAY01DroidKaigi 2017 welcometalk DAY01
DroidKaigi 2017 welcometalk DAY01Masahiro Hidaka
 
School for Change Agents - Module 4 Slides
School for Change Agents - Module 4 SlidesSchool for Change Agents - Module 4 Slides
School for Change Agents - Module 4 SlidesNHS Horizons
 
Présentation projet espace Coworking / FabLab à claret
Présentation projet espace Coworking / FabLab à claretPrésentation projet espace Coworking / FabLab à claret
Présentation projet espace Coworking / FabLab à claretRaid Entreprendre
 

Andere mochten auch (20)

Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016Como Apresentar Codigo em Slides - Javou #7 - 2016
Como Apresentar Codigo em Slides - Javou #7 - 2016
 
Principal of marketing
Principal  of marketingPrincipal  of marketing
Principal of marketing
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 
Presentación1
Presentación1Presentación1
Presentación1
 
Twitter Tutorial
Twitter TutorialTwitter Tutorial
Twitter Tutorial
 
Google AMP 1 an après : quel bilan, quelles perspectives ?
Google AMP 1 an après : quel bilan, quelles perspectives ?Google AMP 1 an après : quel bilan, quelles perspectives ?
Google AMP 1 an après : quel bilan, quelles perspectives ?
 
Ptsa201617.pdf
Ptsa201617.pdfPtsa201617.pdf
Ptsa201617.pdf
 
Actualizacion de recomendación sobre vacuna frente a tetanos
Actualizacion de recomendación sobre vacuna frente a tetanosActualizacion de recomendación sobre vacuna frente a tetanos
Actualizacion de recomendación sobre vacuna frente a tetanos
 
English Grammar in Kurdish | ڕێزمانی ئینگلیزی
English Grammar in Kurdish | ڕێزمانی ئینگلیزیEnglish Grammar in Kurdish | ڕێزمانی ئینگلیزی
English Grammar in Kurdish | ڕێزمانی ئینگلیزی
 
Herramientas ofimaticas
Herramientas ofimaticasHerramientas ofimaticas
Herramientas ofimaticas
 
CREANDO ESTRELLAS
CREANDO ESTRELLASCREANDO ESTRELLAS
CREANDO ESTRELLAS
 
The selfish giant
The selfish giantThe selfish giant
The selfish giant
 
Engine de template em Javascript com HTML Sprites
Engine de template em Javascript com HTML SpritesEngine de template em Javascript com HTML Sprites
Engine de template em Javascript com HTML Sprites
 
Preventivo 2017
Preventivo 2017Preventivo 2017
Preventivo 2017
 
The Soul in The Machine - Developing for Humans
The Soul in The Machine - Developing for HumansThe Soul in The Machine - Developing for Humans
The Soul in The Machine - Developing for Humans
 
2017 Edelman Trust Barometer - Brasil
2017 Edelman Trust Barometer - Brasil2017 Edelman Trust Barometer - Brasil
2017 Edelman Trust Barometer - Brasil
 
Psychologie van het motiveren met o.a. Dan Ariely
Psychologie van het motiveren met o.a. Dan ArielyPsychologie van het motiveren met o.a. Dan Ariely
Psychologie van het motiveren met o.a. Dan Ariely
 
DroidKaigi 2017 welcometalk DAY01
DroidKaigi 2017 welcometalk DAY01DroidKaigi 2017 welcometalk DAY01
DroidKaigi 2017 welcometalk DAY01
 
School for Change Agents - Module 4 Slides
School for Change Agents - Module 4 SlidesSchool for Change Agents - Module 4 Slides
School for Change Agents - Module 4 Slides
 
Présentation projet espace Coworking / FabLab à claret
Présentation projet espace Coworking / FabLab à claretPrésentation projet espace Coworking / FabLab à claret
Présentation projet espace Coworking / FabLab à claret
 

Ähnlich wie Lidando com o Caos: testes automatizados PL/SQL

Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Isaac Barros
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Willian Magalhães
 
Estrutura de linguagem C++
Estrutura de linguagem C++Estrutura de linguagem C++
Estrutura de linguagem C++Verônica Veiga
 
Plsql - Conceitos Básicos
Plsql - Conceitos BásicosPlsql - Conceitos Básicos
Plsql - Conceitos BásicosDanilo Braga
 
Compus Party - processing e arduino
Compus Party - processing e arduinoCompus Party - processing e arduino
Compus Party - processing e arduinoCampus Party Brasil
 
PL/SQL - Conceitos Básicos
PL/SQL - Conceitos BásicosPL/SQL - Conceitos Básicos
PL/SQL - Conceitos BásicosDanilo Braga
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYraquelcarsi
 
DOJO - TDD com C++
DOJO - TDD com C++DOJO - TDD com C++
DOJO - TDD com C++thiagodp
 
TDD em C++
TDD em C++TDD em C++
TDD em C++thiagodp
 
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...PGDay Campinas
 
Linguagem c wellington telles - aula 07
Linguagem c   wellington telles - aula 07Linguagem c   wellington telles - aula 07
Linguagem c wellington telles - aula 07profwtelles
 
Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessRafael Farias Silva
 
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04thomasdacosta
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-Cosmarcf
 

Ähnlich wie Lidando com o Caos: testes automatizados PL/SQL (20)

Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
2832014 curso plsql
2832014 curso plsql2832014 curso plsql
2832014 curso plsql
 
Estrutura de linguagem C++
Estrutura de linguagem C++Estrutura de linguagem C++
Estrutura de linguagem C++
 
JavaFX SestInfo 2010
JavaFX SestInfo 2010JavaFX SestInfo 2010
JavaFX SestInfo 2010
 
Plsql - Conceitos Básicos
Plsql - Conceitos BásicosPlsql - Conceitos Básicos
Plsql - Conceitos Básicos
 
Compus Party - processing e arduino
Compus Party - processing e arduinoCompus Party - processing e arduino
Compus Party - processing e arduino
 
Aula 1 | Introdução a C++
Aula 1 | Introdução a C++Aula 1 | Introdução a C++
Aula 1 | Introdução a C++
 
PL/SQL - Conceitos Básicos
PL/SQL - Conceitos BásicosPL/SQL - Conceitos Básicos
PL/SQL - Conceitos Básicos
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
 
DOJO - TDD com C++
DOJO - TDD com C++DOJO - TDD com C++
DOJO - TDD com C++
 
TDD em C++
TDD em C++TDD em C++
TDD em C++
 
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
PGDay Campinas 2013 - PL/pg…ETL – Transformação de dados para DW e BI usando ...
 
Falando "Postgrês"
Falando "Postgrês"Falando "Postgrês"
Falando "Postgrês"
 
Linguagem c wellington telles - aula 07
Linguagem c   wellington telles - aula 07Linguagem c   wellington telles - aula 07
Linguagem c wellington telles - aula 07
 
Groovy para javeiros - Migração Painless
Groovy para javeiros - Migração PainlessGroovy para javeiros - Migração Painless
Groovy para javeiros - Migração Painless
 
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-C
 

Mehr von Rafael Ponte

TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSETechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSERafael Ponte
 
TechDay Retrospectiva 2018
TechDay Retrospectiva 2018TechDay Retrospectiva 2018
TechDay Retrospectiva 2018Rafael Ponte
 
Arquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do HypeArquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do HypeRafael Ponte
 
Como treinar seu estagiario
Como treinar seu estagiarioComo treinar seu estagiario
Como treinar seu estagiarioRafael Ponte
 
Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Rafael Ponte
 
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015Rafael Ponte
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Rafael Ponte
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Rafael Ponte
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Rafael Ponte
 
Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)Rafael Ponte
 
Importância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a diaImportância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a diaRafael Ponte
 
Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)Rafael Ponte
 
Migrations for Java
Migrations for JavaMigrations for Java
Migrations for JavaRafael Ponte
 
Importância dos testes automatizadoss
Importância dos testes automatizadossImportância dos testes automatizadoss
Importância dos testes automatizadossRafael Ponte
 
Greenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaGreenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaRafael Ponte
 
Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFRafael Ponte
 
Curso de Java server faces (JSF)
Curso de Java server faces (JSF)Curso de Java server faces (JSF)
Curso de Java server faces (JSF)Rafael Ponte
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFRafael Ponte
 
Boas Práticas com JavaServer Faces (Jsf)
Boas Práticas com JavaServer Faces (Jsf)Boas Práticas com JavaServer Faces (Jsf)
Boas Práticas com JavaServer Faces (Jsf)Rafael Ponte
 
JavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeJavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeRafael Ponte
 

Mehr von Rafael Ponte (20)

TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSETechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
TechDay: 10 Features do Oracle que voce nao conhecia - CONNECT BY CLAUSE
 
TechDay Retrospectiva 2018
TechDay Retrospectiva 2018TechDay Retrospectiva 2018
TechDay Retrospectiva 2018
 
Arquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do HypeArquitetura Java - Escalando além do Hype
Arquitetura Java - Escalando além do Hype
 
Como treinar seu estagiario
Como treinar seu estagiarioComo treinar seu estagiario
Como treinar seu estagiario
 
Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)Migrations for Java (Javou #4 - JavaCE)
Migrations for Java (Javou #4 - JavaCE)
 
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
Importancia dos Testes Automatizados no dia a dia FIC-Estacio 2015
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)
 
Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)Hibernate efetivo (COALTI-2014 / ALJUG)
Hibernate efetivo (COALTI-2014 / ALJUG)
 
Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)Migrations for Java (QCONSP2013)
Migrations for Java (QCONSP2013)
 
Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)Importancia dos Testes Automatizados no dia a dia (Don't Panic)
Importancia dos Testes Automatizados no dia a dia (Don't Panic)
 
Importância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a diaImportância dos testes automatizados no dia a dia
Importância dos testes automatizados no dia a dia
 
Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)Hibernate Efetivo (QCONSP-2012)
Hibernate Efetivo (QCONSP-2012)
 
Migrations for Java
Migrations for JavaMigrations for Java
Migrations for Java
 
Importância dos testes automatizadoss
Importância dos testes automatizadossImportância dos testes automatizadoss
Importância dos testes automatizadoss
 
Greenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresaGreenbar - Testes automatizados na sua empresa
Greenbar - Testes automatizados na sua empresa
 
Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSF
 
Curso de Java server faces (JSF)
Curso de Java server faces (JSF)Curso de Java server faces (JSF)
Curso de Java server faces (JSF)
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSF
 
Boas Práticas com JavaServer Faces (Jsf)
Boas Práticas com JavaServer Faces (Jsf)Boas Práticas com JavaServer Faces (Jsf)
Boas Práticas com JavaServer Faces (Jsf)
 
JavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeJavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividade
 

Lidando com o Caos: testes automatizados PL/SQL