Estou precisando realizar testes em uma classe, mas o método é criado usando estruturas condicionais de modo que fiquei sem sabe como criar os testes.
public class Resultados {
public static String mostraInformacoes(FigurasGeometricas retangulo, FigurasGeometricas quadrado, FigurasGeometricas circulo) {
String toString = "";
// Calculo das áreas
toString += " CALCULO DAS AREAS \n\n";
if (retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) {
toString += "A área deste retângulo é: " + CalculodeAreas.areaRetangulo(retangulo) + "\n\n";
} else {
toString += "O valor que vc forneceu não representa nenhuma figura geométrica conhecida!\n\n";
}
if (quadrado.getLarguraQuadrado() > 0) {
toString += "A área deste quadrado é: " + CalculodeAreas.areaQuadrado(quadrado) + "\n\n";
}else {
toString += "O valor que vc forneceu não representa nenhuma figura geométrica conhecida!\n\n";
}
if (circulo.getRaioCirculo() > 0) {
toString += "A área deste círculo é: " + CalculodeAreas.areaCirculo(circulo) + "\n\n";
} else {
toString += "O valor que vc forneceu não representa nenhuma figura geométrica conhecida!\n\n";
}
if ((retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) &&
(quadrado.getLarguraQuadrado() > 0) && (circulo.getRaioCirculo() > 0)) {
toString += "Todas as áreas são: " + CalculodeAreas.areaRetangulo(retangulo) + " " + CalculodeAreas.areaQuadrado(quadrado) + " e "
+ CalculodeAreas.areaCirculo(circulo) + " retângulo, quadrado e círculo, respectivamente. \n\n";
}
toString += "\n CALCULO DOS PERIMETROS \n\n";
if (retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) {
toString += "O perímetro deste retângulo é: " + CalculoDePerimetros.perimetroRetangulo(retangulo) + "\n\n";
}
if (quadrado.getLarguraQuadrado() > 0) {
toString += "O perímetro deste quadrado é: " + CalculoDePerimetros.perimetroQuadrado(quadrado) + "\n\n";
}
if (circulo.getRaioCirculo() > 0) {
toString += "O perímetro deste círculo é: " + CalculoDePerimetros.perimetroCirculo(circulo) + "\n\n";
}
if ((retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) &&
(quadrado.getLarguraQuadrado() > 0) && (circulo.getRaioCirculo() > 0)) {
toString += "Não foi possível calcular o perímetro total...\n\n";
}
toString += "\n CARACTERÍSTICAS DAS FIGURAS \n\n";
if (retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) {
toString += "O retângulo criado tem altura de tamanho: " + retangulo.getAlturaRetangulo() +
" e largura de tamanho: " + retangulo.getLarguraRetangulo() + "\n\n";
}
if (quadrado.getLarguraQuadrado() > 0) {
toString += "O quadrado criado tem lados de tamanho: " + quadrado.getLarguraQuadrado() + "\n\n";
}
if (circulo.getRaioCirculo() > 0) {
toString += "O circulo criado tem raio de tamanho: " + circulo.getRaioCirculo() + "\n\n";
}
if ((retangulo.getAlturaRetangulo() > 0 && retangulo.getLarguraRetangulo() > 0) &&
(quadrado.getLarguraQuadrado() > 0) && (circulo.getRaioCirculo() > 0)) {
toString += "O retângulo criado tem altura: " + retangulo.getAlturaRetangulo() + " e largura de: " + retangulo.getLarguraRetangulo() +
", o quadrado criado tem lados: " + quadrado.getLarguraQuadrado() + " e o circulo criado tem raio: " + circulo.getRaioCirculo();
}
return toString;
}
}
Basicamente, cada IF e ELSE são os cenários (branches) a serem testados.
Por exemplo:
Caso a altura e largura do retangulo seja maior que zero, e todo o resto seja igual a zero, qual deverá ser o retorno?
Esse é um cenário a ser validado no teste, e o mesmo deve ser feito para todos os outros cenários.
Uma coisa que o teste pode falar é sobre a complexidade do código. Se o teste se tornar algo mais complexo do que deveria ser, pode significar que o código a ser testado tb está mais complexo do que deveria ser também.
No método que vc está testando, por exemplo, ele faz o cálculo da área, de perímetro e ainda monta as características das figuras. Os testes seriam mais simples se vc separar isso em métodos diferentes e, consequentemente, o código ficaria mais simples e limpo.
public class ResultadosTest {
private Resultados fixture = new Resultados();
@Test
public void deveMontarMensagemComCalculoDaAreaRetangulo() {
// Arrange (crie os parâmetros de acordo com o cenário a ser testado)
FigurasGeometricas retangulo = //...;
FigurasGeometricas quadrado = //...;
FigurasGeometricas circulo = //...;
// Act
String actual = fixture.mostraInformacoes(retangulo, quadrado, circulo);
// Assert
Assertions.assertEquals("texto que é esperado da execução", actual);
}
}
Pensa assim, se o código a ser testado for grande e complexo, o teste provavelmente será grande e mais complexo de fazer para conseguir realizar o teste desejado. O ideal é vc identificar isso, e otimizar seu código para que o teste seja o mais simples possível.
Por exemplo, em vez de ter um método que faça todas essas coisas, vc poderia dividir em métodos menores e testá-los separadamente:
Você pode me ajudar com relação a minha classe principal como seriam os testes que eu poderia fazer. Não encontrei nada nos grupos de discussão que me desse uma ideia…
public class BrincandoComAsFigurasGeometricas {
public static void main(String[] args) throws Exception {
//Criando variaveis
int alturaDoRetangulo = 0;
int larguraDoRetangulo = 0;
int ladoDoQuadrado = 0;
int raioDoCirculo = 0;
//Inicializando as variaveis
alturaDoRetangulo = 2;
larguraDoRetangulo = 4;
ladoDoQuadrado = 5;
raioDoCirculo = 3;
//
try {//Instanciando as variaveis
FigurasGeometricas retangulo = new FigurasGeometricas(alturaDoRetangulo, larguraDoRetangulo);
FigurasGeometricas quadrado = new FigurasGeometricas(ladoDoQuadrado);
FigurasGeometricas circulo = new FigurasGeometricas(raioDoCirculo);
//Gerando saidas
System.out.println(Resultados.mostrarArea(retangulo, quadrado, circulo));
System.out.println(Resultados.mostraPerimetro(retangulo, quadrado, circulo));
System.out.println(Resultados.mostrarCaracteristicas(retangulo, quadrado, circulo));
} catch (Exception e) {
throw new Exception(e);
}
}
}
O que vc deve testar é a classe Resutados e não a classe principal. Até dá para testar a classe principal, mas o ganho é muito pouco. Vc teria que fazer mock da impressao no console para comparar a saída, o que é algo mais complexo de fazer. Veja:
Classe principal com os System.out.printlns:
public class Principal {
public static void main(String[] args) throws Exception {
System.out.println("Hello world");
}
}
Teste da classe principal:
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class PrincipalTest {
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
@BeforeEach
public void setUpStreams() {
System.setOut(new PrintStream(outContent));
}
@AfterEach
public void restoreStreams() {
System.setOut(originalOut);
}
@Test
void test() throws Exception {
Principal principal = new Principal();
principal.main(new String[] {});
// Aqui é validado se a saída do console foi realmente "Hello world\n" (\n pq é um println)
assertEquals("Hello world\n", outContent.toString());
}
}