Last active
November 12, 2024 18:34
-
-
Save rafaelpontezup/ecba938670eb13f876bd279e898b84af to your computer and use it in GitHub Desktop.
Quantos e quais cenarios/casos de testes você enxerga para o código da classe ParceladorDeFatura? (adiciona resposta nos comentarios)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package br.com.zup.edu.certificacoes.testing.parcelador; | |
import java.math.BigDecimal; | |
import java.math.RoundingMode; | |
import java.util.ArrayList; | |
import java.util.List; | |
public class ParceladorDeFatura { | |
public static final BigDecimal VALOR_MINIMO_FATURA = new BigDecimal("100"); | |
public static final BigDecimal VALOR_MAXIMO_FATURA = new BigDecimal("100000"); // UPDATED at 2024-10-24 | |
public List<BigDecimal> parcela(BigDecimal valor, int quantidadeDeParcelas) { | |
if (valor == null) { | |
throw new FaturaInvalidaException("Valor da fatura não pode ser nula"); | |
} | |
if (valor.compareTo(VALOR_MINIMO_FATURA) < 0) { | |
throw new FaturaInvalidaException("Valor da fatura muito baixo para parcelamento"); | |
} | |
// UPDATED at 2024-10-24 | |
if (valor.compareTo(VALOR_MAXIMO_FATURA) > 0) { | |
throw new FaturaInvalidaException("Valor da fatura acima do valor máximo para parcelamento"); | |
} | |
if (quantidadeDeParcelas < 2 || quantidadeDeParcelas > 10) { | |
throw new FaturaInvalidaException("Número de parcelas deve estar entre 2 e 10"); | |
} | |
BigDecimal numeroDeParcelas = BigDecimal.valueOf(quantidadeDeParcelas); | |
BigDecimal valorDaParcela = valor.divide(numeroDeParcelas, 2, RoundingMode.DOWN); | |
List<BigDecimal> parcelas = new ArrayList<>(); | |
for (int i = 0; i < quantidadeDeParcelas - 1; i++) { | |
parcelas.add(valorDaParcela); | |
} | |
// adiciona resto na ultima parcela | |
BigDecimal resto = valor.subtract(valorDaParcela.multiply(numeroDeParcelas)); | |
parcelas.add(valorDaParcela.add(resto)); | |
return parcelas; | |
} | |
} | |
A : BigDecimal
B : Int
1. A == null ==> Exception
2. A < 100 ==> Exception
3. B < 2 ==> Exception
4. B > 10 ==> Exception
5. Para todo (A : BigDecimal) e (B : Int), onde A!= null, e A >= 100, e B >= 2, e B <= 10,
somaLista(parcela(A,B)) == A
length(parcela(A,B)) == B
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A implementação do método é bem direta. Meu primeiro foco seria testar cada um dos caminhos possíveis nesse método, que são bem claros se vc olhar os ifs do código. Aproveito e sempre que visito um if, olho pro valor de entrada do usuário que ele usa, e analiso o domínio de entrada daquele valor:
A partir daqui o método tem um caminho único. Olhando a implementação, entendo que o código divide o total entre o número de parcelas pedido, adiciona qualquer diferença na última parcela. Regras de arredondamento são duas casas decimais e arredondar pra baixo.
Pensando nas principais variáveis que estão em jogo aqui:
Não consigo pensar em mais nada. Agora é só transformar esses casos de teste em testes automatizados. Se rodar cobertura de código aqui, espero que bata 100%. Se não bater, olhar o que faltou.
Esse método é um excelente caso também para property-based tests. A propriedade é direta, e bem fácil de ser implementada: dado qualquer número de parcelas entre 2 e 10, e qualquer valor maior do que zero, a soma das parcelas geradas tem que ser igual ao valor inicial.
PS: Vc não precisa de testes repetidos. O teste com 2 parcelas que sugeri no começo pode ser o mesmo teste que sugeri quando explorei o "caminho feliz" do método. Quando estou pensando nos casos de testes, não me preocupo muito em encontrar "o menor conjunto de testes", a limpeza acontece depois.