114
Testes de Unidade com JUnit Robinson Castilho – JUGMS [email protected] http://www.jugms.com.br

Palestra Testes Unidade Com JUnit

Embed Size (px)

DESCRIPTION

Palestra sobre técnicas e fases de testes, e informações sobre boas e más práticas comuns ao utilizar JUnit para testes de unidade.Explica também as principais anotações do framework JUnit, e a anotação disponibilizada na versão 4.7: @Rule

Citation preview

Page 1: Palestra Testes Unidade Com JUnit

Testes de Unidade com JUnit

Robinson Castilho – [email protected]

http://www.jugms.com.br

Page 2: Palestra Testes Unidade Com JUnit

Apresentação

● Robinson Castilho● Desenvolvedor C++ e Java desde 2001● Sun Certified Java Programmer● Sun Certified Web Component Developer● Fundador da Bacarin Software● Instrutor SENAC/MS● Coordenador do JUGMS

Page 3: Palestra Testes Unidade Com JUnit

Certa vez fui convidado...

Page 4: Palestra Testes Unidade Com JUnit

Certa vez fui convidado...

Pilotar novo modelode avião

Page 5: Palestra Testes Unidade Com JUnit

Avião Moderno

Page 6: Palestra Testes Unidade Com JUnit

Avião Moderno Bonito

Page 7: Palestra Testes Unidade Com JUnit

Avião Moderno BonitoInovador

Page 8: Palestra Testes Unidade Com JUnit

Avião Moderno BonitoInovador Econômico

Page 9: Palestra Testes Unidade Com JUnit

?

Page 10: Palestra Testes Unidade Com JUnit

?

Page 11: Palestra Testes Unidade Com JUnit

?

Page 12: Palestra Testes Unidade Com JUnit

?

Page 13: Palestra Testes Unidade Com JUnit

Um detalhe: o avião nunca...

Page 14: Palestra Testes Unidade Com JUnit

Um detalhe: o avião nunca...

TINHA SIDO TESTADO

Page 15: Palestra Testes Unidade Com JUnit

Olha o Avião

Page 16: Palestra Testes Unidade Com JUnit

Roubada?

Page 17: Palestra Testes Unidade Com JUnit

Roubada?

SIM

Page 18: Palestra Testes Unidade Com JUnit

Roubada?

SIM

Page 19: Palestra Testes Unidade Com JUnit

Pense no mundo real

Page 20: Palestra Testes Unidade Com JUnit

Pense no mundo real

Cliente recebe um software:

Page 21: Palestra Testes Unidade Com JUnit

Pense no mundo real

Cliente recebe um software:

Moderno

Page 22: Palestra Testes Unidade Com JUnit

Pense no mundo real

Cliente recebe um software:

Moderno

Inovador

Page 23: Palestra Testes Unidade Com JUnit

Pense no mundo real

Cliente recebe um software:

Moderno

Inovador

Econômico

Page 24: Palestra Testes Unidade Com JUnit

Pense no mundo real

Cliente recebe um software:

Moderno

Inovador

Econômico

Nunca foi testado

Page 25: Palestra Testes Unidade Com JUnit

Roubada?

Page 26: Palestra Testes Unidade Com JUnit

Roubada?

SIM

Page 27: Palestra Testes Unidade Com JUnit

Teste seu software

Page 28: Palestra Testes Unidade Com JUnit

Agenda

Page 29: Palestra Testes Unidade Com JUnit

Agenda

● Importância dos testes

Page 30: Palestra Testes Unidade Com JUnit

Agenda

● Importância dos testes● Técnicas e Fases de testes

Page 31: Palestra Testes Unidade Com JUnit

Agenda

● Importância dos testes● Técnicas e Fases de testes● Testes de Unidade

Page 32: Palestra Testes Unidade Com JUnit

Agenda

● Importância dos testes● Técnicas e Fases de testes● Testes de Unidade

– Ferramenta JUnit

Page 33: Palestra Testes Unidade Com JUnit

Agenda

● Importância dos testes● Técnicas e Fases de testes● Testes de Unidade

– Ferramenta JUnit– Boas e más Práticas

Page 34: Palestra Testes Unidade Com JUnit

Agenda

● Importância dos testes● Técnicas e Fases de testes● Testes de Unidade

– Ferramenta JUnit– Boas e más Práticas

● Tomar chopp :)

Page 35: Palestra Testes Unidade Com JUnit

Dados não mentem

Page 36: Palestra Testes Unidade Com JUnit

Dados não mentem

Erros existem:

Page 37: Palestra Testes Unidade Com JUnit

Dados não mentem

Erros existem:

1/3 poderiam ser evitados

Page 38: Palestra Testes Unidade Com JUnit

Dados não mentem

Erros existem:

1/3 poderiam ser evitados

50% são detectados em produção

Page 39: Palestra Testes Unidade Com JUnit

Dados não mentem

Erros existem:

1/3 poderiam ser evitados

50% são detectados em produção

Prejuízo de US$ ~60 bilhões/ano Fonte: http://www.nist.gov/public_affairs/releases/n02-10.htm

Page 40: Palestra Testes Unidade Com JUnit

Para que serve um teste?

Page 41: Palestra Testes Unidade Com JUnit

Verificar que uma determinada entrada

produzSEMPRE

uma mesma saída

Page 42: Palestra Testes Unidade Com JUnit

Como testar corretamente?

Page 43: Palestra Testes Unidade Com JUnit

Caixa Preta

Page 44: Palestra Testes Unidade Com JUnit

Caixa Preta

Não se preocupa com o Não se preocupa com o código fontecódigo fonte

Page 45: Palestra Testes Unidade Com JUnit

Caixa Preta

Não se preocupa com o Não se preocupa com o código fontecódigo fonte

Saídas são coerentes com as Saídas são coerentes com as entradas?entradas?

Page 46: Palestra Testes Unidade Com JUnit

Caixa Preta

Não se preocupa com o Não se preocupa com o código fontecódigo fonte

Saídas são coerentes com as Saídas são coerentes com as entradas?entradas?

Equipe testes (normalmente) Equipe testes (normalmente) é diferente da equipe é diferente da equipe

implementaçãoimplementação

Page 47: Palestra Testes Unidade Com JUnit

Caixa Branca

Page 48: Palestra Testes Unidade Com JUnit

Caixa Branca

Trabalha com o código fonteTrabalha com o código fonte

Page 49: Palestra Testes Unidade Com JUnit

Caixa Branca

Trabalha com o código fonteTrabalha com o código fonteAvalia aspectos:Avalia aspectos:

Page 50: Palestra Testes Unidade Com JUnit

Caixa Branca

Trabalha com o código fonteTrabalha com o código fonteAvalia aspectos:Avalia aspectos:● Teste de condiçãoTeste de condição● Teste de fluxo de dadosTeste de fluxo de dados● Teste de ciclosTeste de ciclos● Teste de caminho lógicoTeste de caminho lógico● Código nunca executado...Código nunca executado...

Page 51: Palestra Testes Unidade Com JUnit

Fases: Fases: Testes de Unidade

Page 52: Palestra Testes Unidade Com JUnit

Fases: Testes de UnidadeFases: Testes de Unidade

Page 53: Palestra Testes Unidade Com JUnit

Fases: Testes de UnidadeFases: Testes de Unidade

Testa o códigoTesta o código

Page 54: Palestra Testes Unidade Com JUnit

Fases: Testes de UnidadeFases: Testes de Unidade

Testa o códigoTesta o códigoPequenas unidadesPequenas unidades

Page 55: Palestra Testes Unidade Com JUnit

Fases: Testes de UnidadeFases: Testes de Unidade

Testa o códigoTesta o códigoPequenas unidadesPequenas unidadesIndependentesIndependentes

Page 56: Palestra Testes Unidade Com JUnit

Fases: Testes de UnidadeFases: Testes de Unidade

Testa o códigoTesta o códigoPequenas unidadesPequenas unidadesIndependentesIndependentes(sub-rotinas, trechos)(sub-rotinas, trechos)

Page 57: Palestra Testes Unidade Com JUnit

Teste de IntegraçãoTeste de Integração

Page 58: Palestra Testes Unidade Com JUnit

Teste de IntegraçãoTeste de Integração

Testa a integração internaTesta a integração internade um sistemade um sistema

Page 59: Palestra Testes Unidade Com JUnit

Teste de IntegraçãoTeste de Integração

Testa a integração internaTesta a integração internade um sistemade um sistema

Verifica se as peças Verifica se as peças do do quebra-cabeçasquebra-cabeças

Estão encaixadasEstão encaixadas

Page 60: Palestra Testes Unidade Com JUnit

Teste de Sistema

Page 61: Palestra Testes Unidade Com JUnit

Teste de Sistema

Ponto de vista do cliente finalcliente final

Page 62: Palestra Testes Unidade Com JUnit

Teste de Sistema

Ponto de vista do cliente finalcliente final

Page 63: Palestra Testes Unidade Com JUnit

Teste de Sistema

Ponto de vista do cliente finalcliente final

SimularSimular ambiente que o cliente utilizarácliente utilizará

Page 64: Palestra Testes Unidade Com JUnit

Teste de Aceitação

Page 65: Palestra Testes Unidade Com JUnit

Teste de Aceitação

Aprovado ou não?

Page 66: Palestra Testes Unidade Com JUnit

Teste de Aceitação

Aprovado ou não?

Page 67: Palestra Testes Unidade Com JUnit

Teste de Aceitação

Aprovado ou não?

Grupo restritoGrupo restrito

usuários finaisusuários finais

simulam o usosimulam o uso

em produçãoem produção

Page 68: Palestra Testes Unidade Com JUnit

Teste de Aceitação

Aprovado ou não?

Grupo restritoGrupo restrito

usuários finaisusuários finais

simulam o usosimulam o uso

em produçãoem produção

Determina se o sistema satisfaz os critérios estabelecidos

Page 69: Palestra Testes Unidade Com JUnit
Page 70: Palestra Testes Unidade Com JUnit

JUnit

Page 71: Palestra Testes Unidade Com JUnit

JUnitautomatizar testes de unidade

Page 72: Palestra Testes Unidade Com JUnit

JUnitautomatizar testes de unidade

Open Source

Page 73: Palestra Testes Unidade Com JUnit

JUnitautomatizar testes de unidade

Open Source

Largamente Utilizado

Page 74: Palestra Testes Unidade Com JUnit

JUnitautomatizar testes de unidade

Open Source

Largamente Utilizado

Criação rápida de testes

Page 75: Palestra Testes Unidade Com JUnit

JUnitautomatizar testes de unidade

Open Source

Largamente Utilizado

Criação rápida de testes

Diminuir necessidade de depuração

Page 76: Palestra Testes Unidade Com JUnit

JUnitautomatizar testes de unidade

Open Source

Largamente Utilizado

Criação rápida de testes

Diminuir necessidade de depuração

Integrável ao Eclipse, Netbeans, Maven...

Page 77: Palestra Testes Unidade Com JUnit

Utilizando JUnit 4

public class OlaMundoTest {@Testpublic void testSoma() {

assertEquals(10, Calc.soma(7,3));}

}

Page 78: Palestra Testes Unidade Com JUnit

Relatório no Eclipse

Page 79: Palestra Testes Unidade Com JUnit

JUnit - Ciclo de vida

*DZone RefCardz

Page 80: Palestra Testes Unidade Com JUnit

@TestInforma que é um método de testeAtributos: ● expected● timeout

Page 81: Palestra Testes Unidade Com JUnit

@Before e @AfterMétodos executados antes e após um método de teste (setUp e tearDown)

Page 82: Palestra Testes Unidade Com JUnit

@Before e @AfterMétodos executados antes e após um método de teste (setUp e tearDown)

@BeforeClass e @AfterClassMétodos executados

antes e após uma classe de teste

Page 83: Palestra Testes Unidade Com JUnit

Novidades do JUnit 4.7

Page 84: Palestra Testes Unidade Com JUnit

Novidades do JUnit 4.7Anotação: @Rule

Page 85: Palestra Testes Unidade Com JUnit

Novidades do JUnit 4.7Anotação: @RuleRedefinir e adicionar comportamentos

Page 86: Palestra Testes Unidade Com JUnit

Novidades do JUnit 4.7Anotação: @RuleRedefinir e adicionar comportamentosMecanismo de Meta-testes simples e claro

Page 87: Palestra Testes Unidade Com JUnit

@Rule● TemporaryFolder: Permite criar pastas e

arquivos que serão automaticamente deletados após o teste

public static class HasTempFolder {@Rulepublic TemporaryFolder folder= new TemporaryFolder();@Testpublic void testUsingTempFolder() throws IOException {

File createdFile= folder.newFile("myfile.txt");File createdFolder= folder.newFolder("subfolder");// ...

}}

Page 88: Palestra Testes Unidade Com JUnit

@Rule● ExternalResource: Classe base para Rules que

necessitam obter recursos externos (socket, conexão com SGBD, etc...)public static class UsesExternalResource {

Server myServer = new Server();@Rule public ExternalResource resource = new ExternalResource() {

@Overrideprotected void before() throws Throwable {

myServer.connect();}

@Overrideprotected void after() {

myServer.disconnect();};

};

@Test public void testFoo() {new Client().run(myServer);

}}

Page 89: Palestra Testes Unidade Com JUnit

@Rule● ErrorCollector: Permite que a execução do teste

continue, coletando todos os erros ocorridos

● Veja mais em: http://www.junit.org/node/574

public static class UsesErrorCollectorTwice {@Rulepublic ErrorCollector collector= new ErrorCollector();@Test public void example() {

collector.addError(new Throwable("first thing went wrong"));collector.addError(new Throwable("second thing went wrong"));

}}

Page 90: Palestra Testes Unidade Com JUnit

Boas práticas

Page 91: Palestra Testes Unidade Com JUnit

Boas práticas

● Execute os testes frequentemente

Page 92: Palestra Testes Unidade Com JUnit

Boas práticas

● Execute os testes frequentemente● Escreva um teste para o defeito

antes de corrigi-lo

Page 93: Palestra Testes Unidade Com JUnit

Boas práticas

● Execute os testes frequentemente● Escreva um teste para o defeito

antes de corrigi-lo● Escreva testes, não logs para depuração:

– System.out.println(...)– logger.info(...)

Page 94: Palestra Testes Unidade Com JUnit

Más práticas

● Múltiplos assertions. Evite isso!

public class MyTestCase { @Test public void testSomething() { assertEquals(10, Calc.soma(7,3)); assertEquals(50, Calc.multiplica(5,10)); assertEquals(30, Calc.subtrai(50,20)); }}

Page 95: Palestra Testes Unidade Com JUnit

Más práticas

● Múltiplos assertions. Forma correta:public class MyTestCase {

@Test public void testCondition1() { assertEquals(10, Calc.soma(7,3)); } @Test public void testCondition2() { assertEquals(50, Calc.multiplica(5,10)); } @Test public void testCondition3() { assertEquals(30, Calc.subtrai(50,20)); }}

Page 96: Palestra Testes Unidade Com JUnit

Más práticas

● Método errado. Evite!

assertTrue("Os objetos devem ser o mesmo", expected == actual);assertTrue("Os objetos devem ser iguais", expected.equals(actual));assertTrue("O objeto deve ser nulo", actual == null);assertTrue("O objeto não pode ser nulo", actual != null);

Use:

assertSame("Os objetos devem ser o mesmo", expected, actual);assertEquals("Os objetos devem ser iguais", expected, actual);assertNull("O objeto deve ser nulo", actual);assertNotNull("O objeto não pode ser nulo", actual);

Page 97: Palestra Testes Unidade Com JUnit

Más práticas

● Cobertura superficial– Caminho perfeito– Funcionalidades fáceis de testar– Alternativa: Code Coverage Tools

Page 98: Palestra Testes Unidade Com JUnit

Más práticas

● Testes excessivamente complexos

Page 99: Palestra Testes Unidade Com JUnit

Más práticas

● Testes excessivamente complexos

Refatorar até obter:

Page 100: Palestra Testes Unidade Com JUnit

Más práticas

● Testes excessivamente complexos

Refatorar até obter:1.Configuração

2.Declaração dos resultados esperados

3.Executar método a ser testado

4.Recuperar resultado

5.Verificar resultado encontrado X esperado

Page 101: Palestra Testes Unidade Com JUnit

Más práticas

● Capturar exceções Inesperadaspublic void testCalculation() {

try {

srv.calculate();

assertEquals(42,srv.getResult());

}catch(CalculationException ex) {

Log.error("Calculation caused exception", ex);

}

}

Page 102: Palestra Testes Unidade Com JUnit

Más práticas

public void testCalculation() throw CalculationException { srv.calculate();

assertEquals(42,srv.getResult());}

● Forma correta: Não capture exceções inesperadas

Page 103: Palestra Testes Unidade Com JUnit

Más práticas● Validando exceções. Forma correta:

@Test(expected=IndexOutOfBoundException.class)public void testIndexOutOfBoundsException() {

try {

ArrayList emptyList = new ArrayList();

Object o = emptyList.get(0);

}

}

Page 104: Palestra Testes Unidade Com JUnit

Más práticas

Page 105: Palestra Testes Unidade Com JUnit

Más práticas

Não

Page 106: Palestra Testes Unidade Com JUnit

Más práticas

Não escrever

Page 107: Palestra Testes Unidade Com JUnit

Más práticas

Não escrever Testes !!

Page 108: Palestra Testes Unidade Com JUnit

Reflexão Final

"Todo programador sabe que é capaz de escrever testes para seu código. Poucos escrevem. A resposta universal para a pergunta

"porque não?" é "Eu estou muito ocupado". Essa atitude torna-se um ciclo: quanto mais pressão você sente, menos testes você escreve.

Quanto menos testes você escreve, menos produtivo você se torna e menos estável seu código fica. Quanto menos produtivo você se

torna, mais pressão você sente".*

* http://junit.sourceforge.net/doc/testinfected/testing.htm

Page 109: Palestra Testes Unidade Com JUnit

Sobre o JUGMS

● Grupo de usuários Java do MS● Forte atuação em Campo Grande● Participa e promove eventos, palestras e

reuniões● Visite-nos: http://www.jugms.com.br

Page 110: Palestra Testes Unidade Com JUnit

Sobre o Javaneiros

● Evento sobre todas as vertentes da tecnologia Java

● + de 500 inscritos em 2008● Edição 2009

– 14 de novembro de 2009 – Campo Grande/MS– Universidade Unaes– Entrada: 1 kg de alimento– Reservas especiais para caravanas– http://javaneiros.jugms.com.br

Page 111: Palestra Testes Unidade Com JUnit

Sobre a Bacarin Software

● Residente na Incubadora de Empresas da UNIDERP

● Fornece sistemas web para:– Comércio Eletrônico– Web Sites– Gerenciamento Eletrônico de Documentos

● Visite-nos: http://www.bacarin.com.br

Page 112: Palestra Testes Unidade Com JUnit

Dúvidas?

Page 113: Palestra Testes Unidade Com JUnit

Bibliografia● http://pt.wikipedia.org/wiki/JUnit

● http://www.improveit.com.br/xp/praticas/tdd

● http://www.exubero.com/junit/antipatterns.html

● http://www.guj.com.br/java.tutorial.artigo.40.1.guj

● http://www.junit.org/junit/javadoc/3.8.1/junit/framework/Assert.html

● http://junit.sourceforge.net/doc/testinfected/testing.htm

● http://www-128.ibm.com/developerworks/opensource

/library/os-junit/?ca=dgr-lnxw07JUnite

● http://pt.wikipedia.org/wiki/Teste_de_software

● http://www.slideshare.net/jeveaux/*

● http://www.junit.org/node/574

Page 114: Palestra Testes Unidade Com JUnit

Licença● Este material está licenciado sob a Licença Creative-Commons

Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil

● Você pode:

– Copiar, distribuir, exibir e executar a obra

– Criar obras derivadas

● Sob as seguintes condições:

– Atribuição. Você deve dar crédito ao autor original, da forma especificada pelo autor ou licenciante.

– Uso Não-Comercial. Você não pode utilizar esta obra com finalidades comerciais.

– Compartilhamento pela mesma Licença. Se você alterar, transformar, ou criar outra obra com base nesta, você somente poderá distribuir a obra resultante sob uma licença idêntica a esta.