XP : FatorarOsTestes

XP » XP » WebHome » EncontrosRadicais » DezenoveDeAbril » PorExemplo » RepeteSeADose » TesteNove » FatorarOsTestes

Fatorar o código de testes?

Sim... se não há nenhuma garantia de que sejamos infalíveis em nosso código de produção (porisso usamos os testes) então quem garante que não erramos em nosso código de testes?

O que nos está trancando, objetivamente, é o fato que, na verdade, não temos mais testes rodando. Nossos dois últimos testes apenas derrubam o software. Qual o problema?

O problema é simples: passamos a usar pré-condições em nosso código de produção (classe Triangulo).

Isso significa o estabelecimento de um contrato com nossos clientes: só aceitaremos lados válidos. Em troca, nunca construiremos triangulos inválidos, e permitimos a classificação do triangulo.

Cabe a nossos clientes cuidar de obedecer as pré-condições. E aqui foi nossa falha: nosso código de testes é um cliente de Triângulo, e não está cumprindo o contrato.

Que fazer?

Vamos reescrever o teste... O teste atual está escrito como:

      Triangulo t3 = new Triangulo (2,3,-4);  
      assert (false == t3.éEquilátero()) :"NÃO é equilátero o triângulo (2,3,-4)";

e isso derruba o software, pois o cliente (nossa classe de testes) não respeita o contrato.

O que deveríamos realmente testar era: "Se for feita tentativa de criar triangulo com algum lado negativo, deve ser gerada uma exceção com a mensagem ' Lados devem ter valores positivos' "

Como testar isso? Capturando o AssertionError gerado pelo triangulo:


 try {
            t = new Triangulo(2, 3, -4);
        } catch (AssertionError ae) {
            assert (ae.getMessage().equals("Lados devem ter valores positivos"));
        }

Nosso código de Testes agora ficou assim:


//Criado em 14/04/2005 

package TrianguloTDD;

//Última modificação 14/04/2005 fernando

public class Testar_Triangulo {

    public static void main(String argumento[]) {
        Triangulo t = new Triangulo(2, 3, 4);
        assert (t.éEscaleno()) : "O triangulo (2,3,4) é escaleno";

        Triangulo t1 = new Triangulo(2, 2, 2);
        assert (t1.éEquilátero()) : "O triangulo (2,2,2) é equilátero";
        assert (t1.éIsósceles()) : "O triangulo (2,2,2) é isósceles";

        assert (false == t.éIsósceles()) : "NÃO é isósceles o triângulo (2,3,4)";

        Triangulo t2 = new Triangulo(4, 4, 7);
        assert (t2.éIsósceles()) : "é isósceles o triângulo (4,4,7)";
        assert (false == t2.éEquilátero()) : "NÃO é equilátero o triângulo (4,4,7)";
        assert (false == t2.éEscaleno()) : "NÃO é escaleno o triângulo (4,4,7)";

        try {
            t = new Triangulo(2, 3, -4);
        } catch (AssertionError ae) {
            assert (ae.getMessage().equals("Lados devem ter valores positivos"));
        }

        try {
            t = new Triangulo(2, 3, 100);
        } catch (AssertionError ae) {
            assert (ae.getMessage().equals("Violadas as Desigualdades Triangulares"));
        }
        
        System.out.println("OK");

    }
}


E D U G R A F - Laboratório de Software Educacional - UFSC - CTC - INE
Campus Universitário - Trindade, Florianópolis, SC, Brasil 88040-090
Fone: +55 48 331 9735 / Fax: +55 48 331-9770