Skip to content

Instantly share code, notes, and snippets.

@joffilyfe
Last active January 31, 2017 14:10
Show Gist options
  • Save joffilyfe/7651e84e488323a3b86c763ebf00198e to your computer and use it in GitHub Desktop.
Save joffilyfe/7651e84e488323a3b86c763ebf00198e to your computer and use it in GitHub Desktop.
TDD e Design de Classes

Nosso primeiro Teste automatizado

O clico do TDD nós diz que devemos começar escrevendo o teste, rodando o teste e vendo-o falhar (vermelho). Após isto, devemos partir para a implementação mais simples, devemos rodar novamente o teste e vermos passar (verde). Sendo assim então partimos para a refatoração (melhoria ou código de produção).

Exemplo do carrinho de compras

Neste exemplo nós mostramos como iniciamos a testar de forma automatizada com Java e o JUnit. Nós criamos o nosso teste, rodamos e o vemos falhar e depois passamos para a implementação. ** NOTA ** nós omitimos a classe produto deste exemplo.

import org.junit.Assert;
import org.junit.Test;
/*
* Testa o valor do maior e menor preço
*/
public class TestaMaiorEMenor {
@Test
public void ordemDecrescente() {
CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
carrinho.adiciona(new Produto("Geladeira", 450.0));
carrinho.adiciona(new Produto("Liquidificador", 250.0));
carrinho.adiciona(new Produto("Jogo de pratos", 70.0));
MaiorEMenor algoritmo = new MaiorEMenor();
algoritmo.encontra(carrinho);
Assert.assertEquals("Jogo de pratos", algoritmo.getMenor().getNome());
Assert.assertEquals("Geladeira", algoritmo.getMaior().getNome());
}
}
public class MaiorEMenor {
private Produto menor;
private Produto maior;
public void encontra(CarrinhoDeCompras carrinho) {
for(Produto produto : carrinho.getProdutos()) {
if(menor == null || produto.getValor() < menor.getValor()) {
menor = produto;
}
if (maior == null || produto.getValor() > maior.getValor()) {
maior = produto;
}
}
}
public Produto getMenor() {
return menor;
}
public Produto getMaior() {
return maior;
}
}
/*
* Testa o retorno do menor valor
*/
import org.junit.Assert;
import org.junit.Test;
public class TestaMaiorEMenor {
@Test
public void apenasUmProduto() {
CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
carrinho.adiciona(new Produto("Geladeira", 450.0));
MaiorEMenor algoritmo = new MaiorEMenor();
algoritmo.encontra(carrinho);
Assert.assertEquals("Geladeira", algoritmo.getMenor().getNome());
Assert.assertEquals("Geladeira", algoritmo.getMaior().getNome());
}
}

TDD e Design de classes

Com o nosso primeiro exemplo nós aprendemos como funciona o ciclo do TDD. Porém nós podemos observar que nós estamos criando uma classe apenas para encontrar o maior e menor valor de um carrinho de compras.

Isto reflete em um problema de design. Neste caso em específico não há motivos para remover a lógica de dentro do carrinho de compras. Nós podemos refatorar nossos testes e nossas classes para a obtenção de um melhor design.

/*
* Nosso teste espera que o carrinho seja responsável por retornar os valores dos produtos
*/
public class CarrinhoDeComprasTest {
@Test
public void deveRetornarZeroSeCarrinhoVazio() {
CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
assertEquals(0.0, carrinho.maiorValor(), 0.0001);
}
@Test
public void deveRetornarValorDoItemSeCarrinhoCom1Elemento() {
CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
carrinho.adiciona(new Item("Geladeira", 1, 900.0));
assertEquals(900.0, carrinho.maiorValor(), 0.0001);
}
@Test
public void deveRetornarMaiorValorSeCarrinhoContemMuitosElementos() {
CarrinhoDeCompras carrinho = new CarrinhoDeCompras();
carrinho.adiciona(new Item("Geladeira", 1, 900.0));
carrinho.adiciona(new Item("Fogão", 1, 1500.0));
carrinho.adiciona(new Item("Máquina de Lavar", 1, 750.0));
assertEquals(1500.0, carrinho.maiorValor(), 0.0001);
}
}
public class CarrinhoDeCompras {
private List<Item> itens;
/*
* Muita coisa omitida..
*/
public double maiorValor() {
if(itens.size() == 0) return 0;
double maior = itens.get(0).getValorTotal();
for(Item item : itens) {
if(maior < item.getValorTotal()) {
maior = item.getValorTotal();
}
}
return maior;
}
public double menorValor() {
if(itens.size() == 0) return 0;
double menor = itens.get(0).getValorTotal();
for (Itens item : this.itens) {
if (item.getValorTotal() < menor) {
menor = item.getValorTotal();
}
}
return menor;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment