29
TDD 2 Testes unitários com JUnit

UnP Eng. Software - Aula 28

Embed Size (px)

DESCRIPTION

Terceira aula sobre testes, e segunda sobre TDD, na qual é apresentada uma estratégia para validação automatizada de requisitos prática com TDD iniciando pela substituição de antigas conferências manuais por teste unitários implementados em java e anotados para teste com o JUnit.

Citation preview

Page 1: UnP Eng. Software - Aula 28

TDD 2Testes unitários com JUnit

Page 2: UnP Eng. Software - Aula 28

HÉLIO MEDEIROSAnalista de Sistemas

SINFO - UFRN

Blog: http://heliomedeiros.comEmail: [email protected]

Page 3: UnP Eng. Software - Aula 28

COMO OBJETIVAR ??

http://www.flickr.com/photos/frank_wuestefeld/4396122394/

Como você faz normalmente para chegar a um lugar onde nunca foi ?

Você conhece o ponto de partida!!!

VOCÊ TEM UMA FOTO DO FINAL!!!

Page 4: UnP Eng. Software - Aula 28

VAGAR ATÉ CHEGAR

http://www.flickr.com/photos/desireedelgado/3344620470/

Você pode vagar até chegar... mais os ambientes no mundo de software são tão hostis quanto o deserto!!!

Você conhece o ponto de partida!!!

Você tem uma foto do final!!

VAGAR ATÉ ACABAR OS RECURSOS

Page 5: UnP Eng. Software - Aula 28

SEGUIR UMA TRILHA

http://www.flickr.com/photos/move_lachine/3517678051/

Ou você pode objetivar a chegada no próximo ponto do caminho que você conhece, seguindo rotas validáveis!!!

Você conhece o ponto de partida!!!

Você tem uma foto do final!!

VOCÊ SEGUE PEQUENOS CAMINHOS CONHECIDOS

Page 6: UnP Eng. Software - Aula 28

OBJETIVE SUA SOLUÇÃO COM TDD!

Page 7: UnP Eng. Software - Aula 28

NOSSA AULA

• Parte 1 - Nomenclatura

• Parte 2 - Testes a moda antiga

• Parte 3 - JUnit

• Parte 4 - Mais exemplos

Page 8: UnP Eng. Software - Aula 28

1 Nomenclatura

Page 9: UnP Eng. Software - Aula 28

TERMOS E SIGNIFICADOS

•Fixture: é o conjunto de dados necessários para rodar os testes;•Teste Unitário: é o tipo de teste realizado sobre uma única CLASSE;•Test Case: é a verificação da resposta de um único método a uma entrada ou conjunto delas;•Test Suite: é o conjunto de TEST CASES;•Test Runner: é o software responsável por rodar testes e gerar relatórios com os resultados;

•Sucesso: é quando o teste é bem sucedido, pois a resposta é a esperada;•Falha: é quando o teste não é bem sucedido, pois a resposta não é a esperada;•Erro: é quando o teste não pode ser realizado por causa de algum erro de execução.

Page 10: UnP Eng. Software - Aula 28

ENTENDENDO

Test Suite

unit test

test case test case test case

test case test case test case

test runner

RelatórioRelatórioX sucessos

Y falhas

Z errosunit test

test case test case test case

test case test case test case

test fixture

Page 11: UnP Eng. Software - Aula 28

2 Teste a moda antiga

Page 12: UnP Eng. Software - Aula 28

VERIFICANDO RESULTADOS

public final class Calculadora { /** * Retorna a aproximação inteira da raiz quadrada de x. */ public static int qualARaiz(int x) { int guess = 1; while (guess * guess < x) { guess++; } return guess;

}}

Page 13: UnP Eng. Software - Aula 28

VERIFICANDO RESULTADOSpublic class CalculadoraTesteSemJUnit { /** Executa os testes. */ public static void main(String[] args) { printTestResult(0); printTestResult(1); printTestResult(2); printTestResult(3); printTestResult(4); printTestResult(7); printTestResult(9); printTestResult(100); }

private static void printTestResult(int arg){ System.out.print("qualARaiz("+arg+") ==> "); System.out.println(Calculadora.qualARaiz(arg)); }}

Page 14: UnP Eng. Software - Aula 28

SAÍDA DO TESTEqualARaiz(0) ==> 1qualARaiz(1) ==> 1qualARaiz(2) ==> 2qualARaiz(3) ==> 2qualARaiz(4) ==> 2qualARaiz(7) ==> 3qualARaiz(9) ==> 3qualARaiz(100) ==> 10

•O código está correto ? Essas são realmente as raizes quadradas ?•Qual o problema com esta saída de dados ?•Como posso saber os problemas gerados quando fizer qualquer alteração futura ?

Page 15: UnP Eng. Software - Aula 28

SOLUÇÕES

Nós podemos neste ponto decidir por duas soluções quando estamos pensando em testes e em automatizá-los:

•Criar nosso próprio programa de testes;•Usar uma ferramenta de testes existente e de qualidade como o JUnit.

Page 16: UnP Eng. Software - Aula 28

3 JUnit

Page 17: UnP Eng. Software - Aula 28

FRAMEWORK

O JUnit é um dos frameworks para escrever testes em Java.

•Foi criado pelo Kent Beck e pelo Erick Gamma;•Ajuda o programador a:

• Definir e executar testes e suítes de testes;• Validar requisitos;• Escrever e depurar código;• Integrar código e ter a garantia de entregar versões funcionais;

Page 18: UnP Eng. Software - Aula 28

PRIMEIRO TESTE UNITÁRIO

import static junit.framework.Assert.*;

public class CalculadoraTesteComJUnit { @Test public void verificaARaizQuadra() { assertEquals(0, Calculadora.qualARaiz(0)); assertEquals(1, Calculadora.qualARaiz(1)); assertEquals(1, Calculadora.qualARaiz(2)); assertEquals(1, Calculadora.qualARaiz(3)); assertEquals(2, Calculadora.qualARaiz(4)); assertEquals(2, Calculadora.qualARaiz(7)); assertEquals(3, Calculadora.qualARaiz(9)); assertEquals(10, Calculadora.qualARaiz(100)); }}

Page 19: UnP Eng. Software - Aula 28

MAIS INFORMATIVO?

Page 20: UnP Eng. Software - Aula 28

UTILIZANDO O JUNIT

No Eclipse:Java Build Path > Add Libraries > JUnit

No Netbeans:Properties > Libraries > Add Library > JUnit

Page 21: UnP Eng. Software - Aula 28

ANOTAÇÕES O JUNIT

Uma classe de testes com a JUnit é um POJO cujos métodos são anotados com @Test, e podem possuir outras anotações como:•@Before, @BeforeClass•@After, @AfterClass•@Ignore•@Test(expected=...)

Page 22: UnP Eng. Software - Aula 28

ANOTAÇÕES O JUNIT

Os testes usam os “assert methods” como:•assertEquals(valor esperado, valor obtido);•assertTrue(condicao booleana);•assertNull(objeto a verificar)

Todos estes métodos são estáticos da classe Assert e para serem utilizados sem a necessidade de referir a classe proprietária do métodos deve ser feito sempre um import static.

Page 23: UnP Eng. Software - Aula 28

4 Mais exemplos

Page 24: UnP Eng. Software - Aula 28

NOVOS REQUISITOS

Sua empresa esta desenvolvendo um novo serviço WEB que auxiliará nos mais diversos cálculos, para tal você cria uma classe para os cálculos básicos chamada Aritmetica.

Uma das operações básicas realizadas sistema a fora é a da soma de dois números e de verificação se o número ou resultado é positivo ou não.

Page 25: UnP Eng. Software - Aula 28

NOVOS REQUISITOS

Escreva o teste unitário para a classe Aritmetica, e os test cases para os métodos soma() e isPositivo().

Page 26: UnP Eng. Software - Aula 28

CLASSE ARITMETICA

public class Aritmetica { public static int soma(int i, int j) { return i + j; }

public static boolean isPositivo(int numero) { return numero > 0 ? true : false; }}

Page 27: UnP Eng. Software - Aula 28

CLASSE TESTE

public class AritmeticaTest { @Test public void testaSomaDeDoisNumeros() { assertEquals(4, Aritmetica.soma(2,2)); assertEquals(-15, Aritmetica.soma(-10, -5)); } @Test public void testaSeEPositivo(){ assertTrue(Aritmetica.isPositivo(5)); assertFalse(Aritmetica.isPositivo(-10)); }

}

Page 28: UnP Eng. Software - Aula 28

NOVOS REQUISITOS

Sua empresa esta desenvolvendo um sistema para chamar em placar eletrônicos por fichas de cientes para o atendimento.

Como exemplo iremos criar e testar a classe “Contador”•O construtor irá criar um contador e setá-lo para zero;•O método incrementar irá adicionar um ao contador e retornar o novo valor ;•O método decrementar irá subtrair um do contador e retornar o novo valor ;

Page 29: UnP Eng. Software - Aula 28

CLASSE CONTADOR

public class ContadorTest { Contador counter; @Before public void setUp() { counter = new Contador(); } @Test public void testIncrement() { assertTrue(counter.increment() == 1); assertTrue(counter.increment() == 2); } @Test public void testDecrement() { assertTrue(counter.decrement() == -1); }}