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.
3. COMO OBJETIVAR ??
Como você faz normalmente para chegar a um lugar onde nunca foi ?
Você conhece o ponto de partida!!!
VOCÊ TEM UMA FOTO DO FINAL!!!
http://www.flickr.com/photos/frank_wuestefeld/4396122394/
4. VAGAR ATÉ CHEGAR
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!!!
VAGAR ATÉ ACABAR OS RECURSOS
Você tem uma foto do final!!
http://www.flickr.com/photos/desireedelgado/3344620470/
5. SEGUIR UMA TRILHA
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Ê SEGUE PEQUENOS
CAMINHOS CONHECIDOS
Você tem uma foto do final!!
http://www.flickr.com/photos/move_lachine/3517678051/
9. 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.
10. ENTENDENDO
Test Suite
Relatório
test fixture X sucessos
Y falhas
Z erros
unit test
test case test case test case
test case test case test case
unit test test
test case test case test case runner
test case test case test case
12. 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;
}
}
13. VERIFICANDO RESULTADOS
public 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));
}
}
14. SAÍDA DO TESTE
qualARaiz(0) ==> 1
qualARaiz(1) ==> 1
qualARaiz(2) ==> 2
qualARaiz(3) ==> 2
qualARaiz(4) ==> 2
qualARaiz(7) ==> 3
qualARaiz(9) ==> 3
qualARaiz(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 ?
15. 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.
17. 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;
18. 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));
}
}
20. UTILIZANDO O JUNIT
No Eclipse:
Java Build Path > Add Libraries > JUnit
No Netbeans:
Properties > Libraries > Add Library > JUnit
21. 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=...)
22. 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.
24. 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.
25. NOVOS REQUISITOS
Escreva o teste unitário para a classe Aritmetica, e os
test cases para os métodos soma() e isPositivo().
26. 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;
}
}
27. 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));
}
}
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;
29. 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);
}
}