SlideShare uma empresa Scribd logo
1 de 60
Teste de Software de A a Z
Palestrante: Camilo Porto
https://www.linkedin.com/in/camiloporto
Sumário
Motivação tradicional para Teste de Software
Testes sob outra óptica
Escrever teste antes ou depois de Codificar? Avaliando Impactos
Design X Testabilidade
Importância da automação e ferramentas
Motivação Tradicional
Por que testar software?
Primeiramente, o que é um teste?
Teste = <cenário, lógica a validar, verificações>
Exemplo
Cenário: parcela1 = 6; parcela2 = 9
Lógica a validar: soma(parcela1, parcela2) : resultado
verificações: resultado == 15
Escrever um teste, portanto, consiste em:
Definir o cenário;
Executar a lógica no contexto do cenário criado
Pesquisa Rápida...
Quem acha que testar código é importante?
Quem acha difícil testar código?
Quem acha chato?
Quem escreve teste para o código que escreve?
Por que testar código de software?
Motivos tradicionais
Garantir que código escrito funciona como imaginado
Tentar identificar bugs em funcionalidades já escritas
Testes sob outra óptica
Visão mais abrangente da prática de teste de software
Já pensou em escrever teste para...
Definir/Expressar onde se quer chegar (objetivo/escopo) com o código que
você irá começar a escrever?
“Vou codificar um cadastro de usuário...”
Já pensou em expressar isso em Java? Com um teste?
Já pensou em escrever teste para...
Definir como a nova funcionalidade será usada (Interface de Uso)?
“Minha classe de negócio vai receber um objeto Usuário com email, nome e rg e retornará um
Relatório da Operação informando se o cadastro foi realizado com sucesso ou com uma lista
de erros ocorridos”
Já pensou em expressar isso em linha de código?
Já pensou em escrever teste para...
Dar foco ao trabalho de codificação...
“O cadastro de usuário deve:
● Validar entradas
● Inserir dados no banco de dados
● enviar email para o usuário ativar cadastro”
Por onde começar?
Já tentou expressar com um teste somente o “próximo passo”?
Já pensou em escrever teste para...
Melhorar o design do seu código (acoplamento, coesão, ..)
Já pensou em escrever teste para...
Documentar o Software?
O que vocês acham que a classe
PaísRepository faz, olhando
somente para a sua suíte de teste?
Consulta um País pelo número de
habitantes?
Consulta um país pelo seu nome?
Como você acha que pode usar essa
classe, olhando somente para um
de seus testes?
public void deveConsultarPorNome() {
String nome = “brasil”
List<Pais> resultado = paisRepository.get(nome)
…. …..
}
Já pensou em escrever teste para...
Debugar o Software?
Onde, nas 60KLOCs, está o
bug?
Já pensou em escrever teste para...
Melhorar manutenibilidade?
Você se sente mais seguro em manter um software com uma bateria robusta
de testes?
Se você fizer bobagem, qual a chance de o teste te alertar?
E se não existir teste?
Já tentou fazer uma grande refatoração em software sem teste? (Atualizar uma
biblioteca para uma nova versão? usar um novo componente?)
Já pensou em escrever teste para...
Aumentar velocidade do desenvolvimento?
Parece contraditório??
Quanto tempo se leva para:
Entregar nova função em produção
Em um software com 60.000 LoC
● Sem testes..
● Com testes?
“... isso estava funcionando.. mas agora, não sei por que, parou de
Encare testes também como
uma ferramenta de
Produtividade
Quando escrever o teste?
Antes ou depois de a função já codificada?
Escrevendo o teste depois....
Depois de a função codificada...
● Lógica já está definida;
● Interface de uso já definida
● Design (classes, métodos, acoplamentos, responsabilidades) já elaborado.
● Nesse contexto, qual é o papel do teste?
○ Confirmar comportamento esperado
○ Cobrir cenários excepcionais.
Depois de a função codificada...
Pontos de atenção
● O escopo da função foi definido em função do cliente (classe que irá invocá-
la) ou o foco tende a ser o algoritmo?
● Pensou-se em deixar o código testável? Ou, somente no momento de
escrever o teste, identificou-se uma dificuldade/inviabilidade de testar o
código?
● O código já ta pronto… há realmente necessidade de escrever teste?
○ “Eu já vi que funciona”
Depois de a função codificada...
Resumo
● Atenção e foco tende a recair no algoritmo, puro e simplesmente
● Análise de cenários possíveis (“what if”), que podem não se concretizar, e a
definição sobre o que fazer tendem a ocorrer de forma caótica e simultânea
○ “E se for null? E se x < 13?”
○ NullPointerException? IllegalArgumentException? return -1?
○ Vai fazer sentido para o cliente da função?
● Tendência de ficar em segundo plano
E se escrevermos o teste antes?
Cadastro de Usuário...
Receber informações de nome, email e senha do usuário;
Realizar validações e persistir informações
Sinalizar se sucesso ou erro
Enviar email com link para ativação da conta.
Expressando como um teste….
class CadastroUsuarioTest {
} Vou fazer o
Cadastro de
Usuários
Expressando como um teste….
class CadastroUsuarioTest {
deveInserirNovoUsuarioNoBanco() {
}
}
Vou começar fazendo a
parte que insere os
dados no banco…
Começando no cenário
de inserir um novo
usuário...
Expressando como um teste….
class CadastroUsuarioTest {
CadastroUsuario cadastro = ...;
deveInserirNovoUsuarioNoBanco() {
Usuario u = new Usuario()
//u.set... com valores bem comportados..
Usuario salvo = cadastro.salvaUsuario(u)
assertNotNull(salvo.getId())
}
}
Quem for usar essa função, vai
me passar as informações dentro
de um objeto Usuario…
.. e vai chamar o método
salvaUsuario.
… vou retornar o mesmo objeto,
com a informação do ID gerado
pelo banco como sinal de que
tudo deu certo.
Cenário após conclusão do raciocínio
class CadastroUsuarioTest {
CadastroUsuario cadastro = ...;
deveInserirNovoUsuarioNoBanco() {
Usuario u = new Usuario()
//u.set... com valores bem comportados..
Usuario salvo = cadastro.salvaUsuario(u)
assertNotNull(salvo.getId())
}
}
código do teste código de produção
Fizemos alguma coisa?
Definimos Interface de Uso?
nome: salvaUsuario
recebe: um único argumento cujo tipo é Usuario
retorna
se sucesso: mesmo objeto de entrada, com ID atribuído;
se falha: ???? (ainda não pensamos sobre isso… o foco ainda não chegou neste ponto).
exceções: ???
Definimos o foco/escopo/objetivo do trabalho?
O que você vai fazer agora?
A.Um enviador de email que manda o link de ativação quando o usuário é
cadastrado?
B.Validar se as informações do usuário são válidas?
C.Tratar o caso onde o argumento ‘Usuario’ for nulo?
D.Algum código que persita as informações do Usuário e gere uma
identificação para ele.
Documentamos nosso código?
No momento, o que deve fazer a classe CadastroUsuario?
A.deve remover usuários?
B.deve enviar emails de ativação?
C.deve inserir novo usuário?
D.deve lançar alguma exceção caso algo de errado ocorra?
Afetamos o design do código de produção?
Quanto à testabilidade…
Fizemos um código de produção testável?
Nem mesmo escrevemos o código, mas seja ele qual for, não só vai nascer
testável, como TESTADO!
Fazendo o teste passar...
Implementado a função
class CadastroUsuarioTest {
CadastroUsuario cadastro = ...;
deveInserirNovoUsuarioNoBanco() {
Usuario u = new Usuario()
//u.set... com valores bem comportados..
Usuario salvo = cadastro.salvaUsuario(u)
assertNotNull(salvo.getId())
}
}
código do teste código de produção
class CadastroUsuario {
usuario salvaUsuario(Usuario u) {
Long idGerado = bancoDeDados.insere(u);
u.setId(idGerado);
return u;
}
}
Cenário após a codificação
class CadastroUsuarioTest {
CadastroUsuario cadastro = ...;
deveInserirNovoUsuarioNoBanco() {
Usuario u = new Usuario()
//u.set... com valores bem comportados..
Usuario salvo = cadastro.salvaUsuario(u)
assertNotNull(salvo.getId())
}
}
código do teste código de produção
class CadastroUsuario {
usuario salvaUsuario(Usuario u) {
Long idGerado = bancoDeDados.insere(u);
u.setId(idGerado);
return u;
}
}
✓ Testável
✓ Testado (cobertura de testes)
✓ Justo (nada de “what-if”)
✓ Refatoração segura
Escreva um teste
antes de
implementar lógica
de produção
Design e Testabilidade
Como seu design (in)viabiliza testar seu código?
Design e Testabilidade
Design do código impacta a testabilidade
Baixa testabilidade pode sinalizar pontos de atenção no design (code smell)
Analisemos alguns cenários...
new… Vs Injeção de Dependência
class CadastroUsuario {
BancoDeDados bancoDados;
usuario salvaUsuario(Usuario u) {
bancoDados = new BancoDeDadosOracleDaInfraEstrutura()
Long idGerado = bancoDeDados.insere(u);
u.setId(idGerado);
return u;
}
}
new… Vs Injeção de Dependência
class CadastroUsuarioTest {
CadastroUsuario cadastro = ...;
deveInserirNovoUsuarioNoBanco() {
Usuario u = new Usuario()
//u.set... com valores bem comportados..
Usuario salvo = cadastro.salvaUsuario(u)
assertNotNull(salvo.getId())
}
}
● Em qual banco será inserido?
● Como faço para, ao testar, usar
outro banco?
● Consigo configurar facilmente
CadastroUsuario para um banco
de testes?
new… Vs Injeção de Dependência
Viabilizando o teste...
class CadastroUsuario {
BancoDeDados bancoDados //… recebe por Injeção de Dependência;
usuario salvaUsuario(Usuario u) {
bancoDados = new BancoDeDadosOracleDaInfraEstrutura()
Long idGerado = bancoDeDados.insere(u);
u.setId(idGerado);
return u;
}
}
new… Vs Injeção de Dependência
class CadastroUsuarioTest {
CadastroUsuario cadastro = ...;
deveInserirNovoUsuarioNoBanco() {
Usuario u = new Usuario()
//u.set... com valores bem comportados..
cadastro.setBancoDados(...// banco de dados de teste em memória)
Usuario salvo = cadastro.salvaUsuario(u)
assertNotNull(salvo.getId())
}
}
new… Vs Injeção de Dependência
new = Forte Acoplamento
difícil manipulação para criação de cenários de teste
Principalmente classes de “infraestrutura” ou “dependência externa”
○ SGBDs, WebServices, Caches, Envio de Emails, etc.
Não crie! receba pronto e use.
Referências Estáticas Vs Instâncias e Interfaces
Cenário: contador de tempo
int contaAteHoje(Data dataNoPassado) {
Data hoje = DateUtils.hoje();
return diferencaEmDias(hoje, dataNoPassado);
}
Referências Estáticas Vs Instâncias e Interfaces
Fazendo um teste...
deveContarDiasAteHoje() {
Data dataNoPassado = 1/1/2016
int contagemReal = contadorDeDias.contaAteHoje(dataNoPassado)
int contagemEsperada = 20;
// O teste só vai passar se executado em 21/1/2016….
assertEquals(contagemReal, contagemEsperada)
}
Referências Estáticas Vs Instâncias e Interfaces
Viabilizando o teste...
Relogio relogio ...// Recebe como Injeção de Dependência
int contaAteHoje(Data dataNoPassado) {
Data hoje = relogio.hoje();
return diferencaEmDias(hoje, dataNoPassado);
}
Referências Estáticas Vs Instâncias e Interfaces
Viabilizando o teste
deveContarDiasAteHoje() {
Data dataNoPassado = 1/1/2016
Data hojeFake = 21/1/2016
Relogio mockRelogio = // Mock de Relogio onde hoje() retorna ‘hojeFake’
contadorDeDias.setRelogio(mockRelogio)
int contagemReal = contadorDeDias.contaAteHoje(dataNoPassado)
int contagemEsperada = 20;
// O teste vai passar qualquer dia...
assertEquals(contagemReal, contagemEsperada)
}
Referências Estáticas Vs Instâncias e Interfaces
Pontos de atenção
Utils.algoQueTodoMundoUsa()
Por que não objeto.algoQueTodoMundoUsa() ?
Isolar com interface
hoje() { return Calendar.getInstance().getTime()) }
Similar com Integrações Externas (SGBDs, WebServices,etc..)
Responsabilidade: Muita Vs Várias Triviais
1 Grande Código Vs 10 pequenos Códigos Integrados
Dado o código abaixo...
Usuario salvaUsuario(Usuario u) {
ControleDeAcesso ca = //cria e configura Controle de Acesso
OperacaoControleAcesso o = ca.criaOperacaoVerificaPermissaoSalvarUsuario();
temPermissao = o.executa()
if(temPermissao) {
TransacaoBancoDados tx = bancoDados.criaTransacao();
tx.begin()
bancoDeDados.insere(u)
tx.commit();
EnviadoDeEmail enviador = //recupera enviador de email
Email email = enviador.novoEmail()
email.// configura email a enviar..
email.envia();
Cache cache = // cria e configura Cache
if(cache.estaNoCache(u)) {
cache.invalidaCache(u)
}
}
… O que precisamos fazer para...
… Criar cenário de teste para testar:
Se a função persiste o usuário no banco?
Se um rollback é disparado, caso ocorra erro?
Se, somente pessoas autorizadas podem invocar a função?
Se um email é enviado corretamente após usuário inserido?
Se a lógica de Cache está correta?
Para testarmos um aspecto do Cadastro de Usuário
(persistência, controle de transação, segurança, envio
de email) temos que nos preocupar com todos os
outros...
Dividir Responsabilidades
Segurança
Transação
Persistência
Email
Cache
Segurança Transação
Persistência
Email
Cache
Cadastro
Usuário
Cadastro Usuário
Evite que seu
design inviabilize
seu teste… crie um
teste antes!
Automação
Não desperdice seu tempo...
Automatize tudo que puder
Sua bateria de testes tende a crescer…
Gaste tempo (muito) pensando em automação de tarefas
Abuse das ferramentas disponíveis
Identifique tarefas rotineiras e repetitivas
Para lhe ajudar
Para saber mais...
http://lmgtfy.com/?q=software+test+tools
Obrigado
https://www.linkedin.com/in/camiloporto

Mais conteúdo relacionado

Mais procurados

tdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papeltdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papelDouglas Siviotti
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Vanderson Silva
 
TDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaTDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaDouglas Siviotti
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Javaalexmacedo
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java BasicoJoel Lobo
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelManoel Pimentel Medeiros
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Diego Pacheco
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasDenis L Presciliano
 
Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...GessdaSilvaMachado
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnitLeonardo Soares
 
Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4Vanderson Silva
 

Mais procurados (20)

tdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papeltdc-2020-poa-pedra-tesoura-papel
tdc-2020-poa-pedra-tesoura-papel
 
Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3Demoiselle Behave - Parte 3
Demoiselle Behave - Parte 3
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
Clean code
Clean codeClean code
Clean code
 
TDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de GuardaTDC Connections 2021 Clausula de Guarda
TDC Connections 2021 Clausula de Guarda
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Java
 
Clean code part 2
Clean code   part 2Clean code   part 2
Clean code part 2
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel Pimentel
 
Clean code
Clean codeClean code
Clean code
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1Treinamento Testes Unitários - parte 1
Treinamento Testes Unitários - parte 1
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependências
 
Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...Test driven development teste e design no mundo real by mauricio aniche (z-li...
Test driven development teste e design no mundo real by mauricio aniche (z-li...
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnit
 
JUnit
JUnitJUnit
JUnit
 
Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4Demoiselle Behave - Parte 4
Demoiselle Behave - Parte 4
 
O que é Teste de Software?
O que é Teste de Software?O que é Teste de Software?
O que é Teste de Software?
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 

Destaque

Desenvolvimento orientado a testes
Desenvolvimento orientado a testesDesenvolvimento orientado a testes
Desenvolvimento orientado a testesCarlos Santana
 
ALM no Visual Studio 2010
ALM no Visual Studio 2010ALM no Visual Studio 2010
ALM no Visual Studio 2010Waldyr Felix
 
01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de Software01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de SoftwareWaldemar Roberti
 
02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentais02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentaisWaldemar Roberti
 
Espresso 101: Introdução a UI Testing
Espresso 101: Introdução a UI TestingEspresso 101: Introdução a UI Testing
Espresso 101: Introdução a UI TestingOnyo
 
Ciclo de vida de testes implementado v2
Ciclo de vida de testes implementado   v2Ciclo de vida de testes implementado   v2
Ciclo de vida de testes implementado v2douglasdc7m
 
AudioGids profile
AudioGids profileAudioGids profile
AudioGids profileaudiogids
 
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...Patrícia Araújo Gonçalves
 

Destaque (20)

04 Unified process
04 Unified process04 Unified process
04 Unified process
 
00 Apresentação
00 Apresentação00 Apresentação
00 Apresentação
 
Desenvolvimento orientado a testes
Desenvolvimento orientado a testesDesenvolvimento orientado a testes
Desenvolvimento orientado a testes
 
ALM no Visual Studio 2010
ALM no Visual Studio 2010ALM no Visual Studio 2010
ALM no Visual Studio 2010
 
Automatização de Ambientes CI & CD & DevOps
Automatização de Ambientes CI & CD & DevOpsAutomatização de Ambientes CI & CD & DevOps
Automatização de Ambientes CI & CD & DevOps
 
01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de Software01 Introdução - Contextualização Engenharia de Software
01 Introdução - Contextualização Engenharia de Software
 
Modelagem Ágil
Modelagem ÁgilModelagem Ágil
Modelagem Ágil
 
06 Requisitos
06 Requisitos06 Requisitos
06 Requisitos
 
Testes: Por onde Começar?
Testes: Por onde Começar?Testes: Por onde Começar?
Testes: Por onde Começar?
 
Ch23
Ch23Ch23
Ch23
 
05 agile
05 agile05 agile
05 agile
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentais02 Introdução à engenharia de software - conceitos fundamentais
02 Introdução à engenharia de software - conceitos fundamentais
 
Panorama sobre Teste de Software
Panorama sobre Teste de SoftwarePanorama sobre Teste de Software
Panorama sobre Teste de Software
 
07 Modelagem (Sommer)
07 Modelagem (Sommer)07 Modelagem (Sommer)
07 Modelagem (Sommer)
 
Espresso 101: Introdução a UI Testing
Espresso 101: Introdução a UI TestingEspresso 101: Introdução a UI Testing
Espresso 101: Introdução a UI Testing
 
Ciclo de vida de testes implementado v2
Ciclo de vida de testes implementado   v2Ciclo de vida de testes implementado   v2
Ciclo de vida de testes implementado v2
 
AudioGids profile
AudioGids profileAudioGids profile
AudioGids profile
 
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
Utilizando a adaptação da ferramenta 5 w2h para análise de teste no contexto ...
 
JUnit Sample
JUnit SampleJUnit Sample
JUnit Sample
 

Semelhante a Testes de software de A a Z

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehaveMarcelo Zeferino
 
Clean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareClean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareGabriel Felipe Soares
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"thiagobapt
 
Teste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTeste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTiago Link
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Qualidade em Testes de Software
Qualidade em Testes de SoftwareQualidade em Testes de Software
Qualidade em Testes de SoftwareGDGFoz
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesEverton Rodrigues
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
ALM - Testes Manuais no Microsoft Test Manager
ALM - Testes Manuais no Microsoft Test ManagerALM - Testes Manuais no Microsoft Test Manager
ALM - Testes Manuais no Microsoft Test ManagerAlan Carlos
 
Qualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMQualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMAdriano Bertucci
 
Não existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu códigoNão existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu códigoRenan Carvalho
 
Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Alex Tercete
 
Todas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilTodas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilElias Nogueira
 

Semelhante a Testes de software de A a Z (20)

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
Clean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de SoftwareClean code - Qualidade em desenvolvimento de Software
Clean code - Qualidade em desenvolvimento de Software
 
TDD para "meros mortais"
TDD para "meros mortais"TDD para "meros mortais"
TDD para "meros mortais"
 
Teste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste vocêTeste sua aplicação antes que ela teste você
Teste sua aplicação antes que ela teste você
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Qualidade em Testes de Software
Qualidade em Testes de SoftwareQualidade em Testes de Software
Qualidade em Testes de Software
 
FC-Logic
FC-LogicFC-Logic
FC-Logic
 
O programador pragmático
O programador pragmáticoO programador pragmático
O programador pragmático
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por Testes
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
ALM - Testes Manuais no Microsoft Test Manager
ALM - Testes Manuais no Microsoft Test ManagerALM - Testes Manuais no Microsoft Test Manager
ALM - Testes Manuais no Microsoft Test Manager
 
Qualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALMQualidade de software com Visual Studio ALM
Qualidade de software com Visual Studio ALM
 
Não existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu códigoNão existe feedback melhor do que o do seu código
Não existe feedback melhor do que o do seu código
 
Microsoft C#
Microsoft C#Microsoft C#
Microsoft C#
 
Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?Por que você não escreve Testes Unitários?
Por que você não escreve Testes Unitários?
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Todas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilTodas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágil
 

Testes de software de A a Z

  • 1. Teste de Software de A a Z Palestrante: Camilo Porto https://www.linkedin.com/in/camiloporto
  • 2. Sumário Motivação tradicional para Teste de Software Testes sob outra óptica Escrever teste antes ou depois de Codificar? Avaliando Impactos Design X Testabilidade Importância da automação e ferramentas
  • 4. Primeiramente, o que é um teste? Teste = <cenário, lógica a validar, verificações> Exemplo Cenário: parcela1 = 6; parcela2 = 9 Lógica a validar: soma(parcela1, parcela2) : resultado verificações: resultado == 15 Escrever um teste, portanto, consiste em: Definir o cenário; Executar a lógica no contexto do cenário criado
  • 5. Pesquisa Rápida... Quem acha que testar código é importante? Quem acha difícil testar código? Quem acha chato? Quem escreve teste para o código que escreve?
  • 6. Por que testar código de software?
  • 7. Motivos tradicionais Garantir que código escrito funciona como imaginado Tentar identificar bugs em funcionalidades já escritas
  • 8. Testes sob outra óptica Visão mais abrangente da prática de teste de software
  • 9. Já pensou em escrever teste para... Definir/Expressar onde se quer chegar (objetivo/escopo) com o código que você irá começar a escrever? “Vou codificar um cadastro de usuário...” Já pensou em expressar isso em Java? Com um teste?
  • 10. Já pensou em escrever teste para... Definir como a nova funcionalidade será usada (Interface de Uso)? “Minha classe de negócio vai receber um objeto Usuário com email, nome e rg e retornará um Relatório da Operação informando se o cadastro foi realizado com sucesso ou com uma lista de erros ocorridos” Já pensou em expressar isso em linha de código?
  • 11. Já pensou em escrever teste para... Dar foco ao trabalho de codificação... “O cadastro de usuário deve: ● Validar entradas ● Inserir dados no banco de dados ● enviar email para o usuário ativar cadastro” Por onde começar? Já tentou expressar com um teste somente o “próximo passo”?
  • 12. Já pensou em escrever teste para... Melhorar o design do seu código (acoplamento, coesão, ..)
  • 13. Já pensou em escrever teste para... Documentar o Software? O que vocês acham que a classe PaísRepository faz, olhando somente para a sua suíte de teste? Consulta um País pelo número de habitantes? Consulta um país pelo seu nome? Como você acha que pode usar essa classe, olhando somente para um de seus testes? public void deveConsultarPorNome() { String nome = “brasil” List<Pais> resultado = paisRepository.get(nome) …. ….. }
  • 14. Já pensou em escrever teste para... Debugar o Software?
  • 15. Onde, nas 60KLOCs, está o bug?
  • 16. Já pensou em escrever teste para... Melhorar manutenibilidade? Você se sente mais seguro em manter um software com uma bateria robusta de testes? Se você fizer bobagem, qual a chance de o teste te alertar? E se não existir teste? Já tentou fazer uma grande refatoração em software sem teste? (Atualizar uma biblioteca para uma nova versão? usar um novo componente?)
  • 17. Já pensou em escrever teste para... Aumentar velocidade do desenvolvimento? Parece contraditório?? Quanto tempo se leva para: Entregar nova função em produção Em um software com 60.000 LoC ● Sem testes.. ● Com testes? “... isso estava funcionando.. mas agora, não sei por que, parou de
  • 18. Encare testes também como uma ferramenta de Produtividade
  • 19. Quando escrever o teste? Antes ou depois de a função já codificada?
  • 20. Escrevendo o teste depois....
  • 21. Depois de a função codificada... ● Lógica já está definida; ● Interface de uso já definida ● Design (classes, métodos, acoplamentos, responsabilidades) já elaborado. ● Nesse contexto, qual é o papel do teste? ○ Confirmar comportamento esperado ○ Cobrir cenários excepcionais.
  • 22. Depois de a função codificada... Pontos de atenção ● O escopo da função foi definido em função do cliente (classe que irá invocá- la) ou o foco tende a ser o algoritmo? ● Pensou-se em deixar o código testável? Ou, somente no momento de escrever o teste, identificou-se uma dificuldade/inviabilidade de testar o código? ● O código já ta pronto… há realmente necessidade de escrever teste? ○ “Eu já vi que funciona”
  • 23. Depois de a função codificada... Resumo ● Atenção e foco tende a recair no algoritmo, puro e simplesmente ● Análise de cenários possíveis (“what if”), que podem não se concretizar, e a definição sobre o que fazer tendem a ocorrer de forma caótica e simultânea ○ “E se for null? E se x < 13?” ○ NullPointerException? IllegalArgumentException? return -1? ○ Vai fazer sentido para o cliente da função? ● Tendência de ficar em segundo plano
  • 24. E se escrevermos o teste antes?
  • 25. Cadastro de Usuário... Receber informações de nome, email e senha do usuário; Realizar validações e persistir informações Sinalizar se sucesso ou erro Enviar email com link para ativação da conta.
  • 26. Expressando como um teste…. class CadastroUsuarioTest { } Vou fazer o Cadastro de Usuários
  • 27. Expressando como um teste…. class CadastroUsuarioTest { deveInserirNovoUsuarioNoBanco() { } } Vou começar fazendo a parte que insere os dados no banco… Começando no cenário de inserir um novo usuário...
  • 28. Expressando como um teste…. class CadastroUsuarioTest { CadastroUsuario cadastro = ...; deveInserirNovoUsuarioNoBanco() { Usuario u = new Usuario() //u.set... com valores bem comportados.. Usuario salvo = cadastro.salvaUsuario(u) assertNotNull(salvo.getId()) } } Quem for usar essa função, vai me passar as informações dentro de um objeto Usuario… .. e vai chamar o método salvaUsuario. … vou retornar o mesmo objeto, com a informação do ID gerado pelo banco como sinal de que tudo deu certo.
  • 29. Cenário após conclusão do raciocínio class CadastroUsuarioTest { CadastroUsuario cadastro = ...; deveInserirNovoUsuarioNoBanco() { Usuario u = new Usuario() //u.set... com valores bem comportados.. Usuario salvo = cadastro.salvaUsuario(u) assertNotNull(salvo.getId()) } } código do teste código de produção
  • 31. Definimos Interface de Uso? nome: salvaUsuario recebe: um único argumento cujo tipo é Usuario retorna se sucesso: mesmo objeto de entrada, com ID atribuído; se falha: ???? (ainda não pensamos sobre isso… o foco ainda não chegou neste ponto). exceções: ???
  • 32. Definimos o foco/escopo/objetivo do trabalho? O que você vai fazer agora? A.Um enviador de email que manda o link de ativação quando o usuário é cadastrado? B.Validar se as informações do usuário são válidas? C.Tratar o caso onde o argumento ‘Usuario’ for nulo? D.Algum código que persita as informações do Usuário e gere uma identificação para ele.
  • 33. Documentamos nosso código? No momento, o que deve fazer a classe CadastroUsuario? A.deve remover usuários? B.deve enviar emails de ativação? C.deve inserir novo usuário? D.deve lançar alguma exceção caso algo de errado ocorra?
  • 34. Afetamos o design do código de produção? Quanto à testabilidade… Fizemos um código de produção testável? Nem mesmo escrevemos o código, mas seja ele qual for, não só vai nascer testável, como TESTADO!
  • 35. Fazendo o teste passar...
  • 36. Implementado a função class CadastroUsuarioTest { CadastroUsuario cadastro = ...; deveInserirNovoUsuarioNoBanco() { Usuario u = new Usuario() //u.set... com valores bem comportados.. Usuario salvo = cadastro.salvaUsuario(u) assertNotNull(salvo.getId()) } } código do teste código de produção class CadastroUsuario { usuario salvaUsuario(Usuario u) { Long idGerado = bancoDeDados.insere(u); u.setId(idGerado); return u; } }
  • 37. Cenário após a codificação class CadastroUsuarioTest { CadastroUsuario cadastro = ...; deveInserirNovoUsuarioNoBanco() { Usuario u = new Usuario() //u.set... com valores bem comportados.. Usuario salvo = cadastro.salvaUsuario(u) assertNotNull(salvo.getId()) } } código do teste código de produção class CadastroUsuario { usuario salvaUsuario(Usuario u) { Long idGerado = bancoDeDados.insere(u); u.setId(idGerado); return u; } } ✓ Testável ✓ Testado (cobertura de testes) ✓ Justo (nada de “what-if”) ✓ Refatoração segura
  • 38. Escreva um teste antes de implementar lógica de produção
  • 39. Design e Testabilidade Como seu design (in)viabiliza testar seu código?
  • 40. Design e Testabilidade Design do código impacta a testabilidade Baixa testabilidade pode sinalizar pontos de atenção no design (code smell) Analisemos alguns cenários...
  • 41. new… Vs Injeção de Dependência class CadastroUsuario { BancoDeDados bancoDados; usuario salvaUsuario(Usuario u) { bancoDados = new BancoDeDadosOracleDaInfraEstrutura() Long idGerado = bancoDeDados.insere(u); u.setId(idGerado); return u; } }
  • 42. new… Vs Injeção de Dependência class CadastroUsuarioTest { CadastroUsuario cadastro = ...; deveInserirNovoUsuarioNoBanco() { Usuario u = new Usuario() //u.set... com valores bem comportados.. Usuario salvo = cadastro.salvaUsuario(u) assertNotNull(salvo.getId()) } } ● Em qual banco será inserido? ● Como faço para, ao testar, usar outro banco? ● Consigo configurar facilmente CadastroUsuario para um banco de testes?
  • 43. new… Vs Injeção de Dependência Viabilizando o teste... class CadastroUsuario { BancoDeDados bancoDados //… recebe por Injeção de Dependência; usuario salvaUsuario(Usuario u) { bancoDados = new BancoDeDadosOracleDaInfraEstrutura() Long idGerado = bancoDeDados.insere(u); u.setId(idGerado); return u; } }
  • 44. new… Vs Injeção de Dependência class CadastroUsuarioTest { CadastroUsuario cadastro = ...; deveInserirNovoUsuarioNoBanco() { Usuario u = new Usuario() //u.set... com valores bem comportados.. cadastro.setBancoDados(...// banco de dados de teste em memória) Usuario salvo = cadastro.salvaUsuario(u) assertNotNull(salvo.getId()) } }
  • 45. new… Vs Injeção de Dependência new = Forte Acoplamento difícil manipulação para criação de cenários de teste Principalmente classes de “infraestrutura” ou “dependência externa” ○ SGBDs, WebServices, Caches, Envio de Emails, etc. Não crie! receba pronto e use.
  • 46. Referências Estáticas Vs Instâncias e Interfaces Cenário: contador de tempo int contaAteHoje(Data dataNoPassado) { Data hoje = DateUtils.hoje(); return diferencaEmDias(hoje, dataNoPassado); }
  • 47. Referências Estáticas Vs Instâncias e Interfaces Fazendo um teste... deveContarDiasAteHoje() { Data dataNoPassado = 1/1/2016 int contagemReal = contadorDeDias.contaAteHoje(dataNoPassado) int contagemEsperada = 20; // O teste só vai passar se executado em 21/1/2016…. assertEquals(contagemReal, contagemEsperada) }
  • 48. Referências Estáticas Vs Instâncias e Interfaces Viabilizando o teste... Relogio relogio ...// Recebe como Injeção de Dependência int contaAteHoje(Data dataNoPassado) { Data hoje = relogio.hoje(); return diferencaEmDias(hoje, dataNoPassado); }
  • 49. Referências Estáticas Vs Instâncias e Interfaces Viabilizando o teste deveContarDiasAteHoje() { Data dataNoPassado = 1/1/2016 Data hojeFake = 21/1/2016 Relogio mockRelogio = // Mock de Relogio onde hoje() retorna ‘hojeFake’ contadorDeDias.setRelogio(mockRelogio) int contagemReal = contadorDeDias.contaAteHoje(dataNoPassado) int contagemEsperada = 20; // O teste vai passar qualquer dia... assertEquals(contagemReal, contagemEsperada) }
  • 50. Referências Estáticas Vs Instâncias e Interfaces Pontos de atenção Utils.algoQueTodoMundoUsa() Por que não objeto.algoQueTodoMundoUsa() ? Isolar com interface hoje() { return Calendar.getInstance().getTime()) } Similar com Integrações Externas (SGBDs, WebServices,etc..)
  • 51. Responsabilidade: Muita Vs Várias Triviais 1 Grande Código Vs 10 pequenos Códigos Integrados
  • 52. Dado o código abaixo... Usuario salvaUsuario(Usuario u) { ControleDeAcesso ca = //cria e configura Controle de Acesso OperacaoControleAcesso o = ca.criaOperacaoVerificaPermissaoSalvarUsuario(); temPermissao = o.executa() if(temPermissao) { TransacaoBancoDados tx = bancoDados.criaTransacao(); tx.begin() bancoDeDados.insere(u) tx.commit(); EnviadoDeEmail enviador = //recupera enviador de email Email email = enviador.novoEmail() email.// configura email a enviar.. email.envia(); Cache cache = // cria e configura Cache if(cache.estaNoCache(u)) { cache.invalidaCache(u) } }
  • 53. … O que precisamos fazer para... … Criar cenário de teste para testar: Se a função persiste o usuário no banco? Se um rollback é disparado, caso ocorra erro? Se, somente pessoas autorizadas podem invocar a função? Se um email é enviado corretamente após usuário inserido? Se a lógica de Cache está correta? Para testarmos um aspecto do Cadastro de Usuário (persistência, controle de transação, segurança, envio de email) temos que nos preocupar com todos os outros...
  • 55. Evite que seu design inviabilize seu teste… crie um teste antes!
  • 57. Automatize tudo que puder Sua bateria de testes tende a crescer… Gaste tempo (muito) pensando em automação de tarefas Abuse das ferramentas disponíveis Identifique tarefas rotineiras e repetitivas