jueves, 5 de mayo de 2011

~Semana 11. Implementación de Pruebas Unitarias

Semana 11
Materia: Taller de Programación Orientada a Objetos
Hora: Jueves M1-M2

Hola a todos, en esta entrada les mostraré la implementación de pruebas unitarias en mi proyecto.

La clase con la que trabajaremos es Carbohidratos.java la cual la muestro a continuación.

ppublic class Carbohidrato {
    
    double lecheDescremada; 
    double lecheSemidescremada;
    double lecheEntera;
    double lecheConAzucar;
    double fruta;
    double verdura;
    double azucarSinGrasa;
    double azucarConGrasa;
    double leguminosa;
    double cerealSinGrasa;
    double cerealConGrasa;
    double alimentoMuyMagro;
    double alimentoMagro;
    double alimentoSemigraso;
    double alimentoGraso;
    double aceiteSinProteina;
    double aceiteConProteina;
    double subtotal1;
    double subtotal2;
    double subtotal3;
    double subtotal4;
    int intercambioLecheDescremada = 1;
    int intercambioLecheSemidescremada = 0;
    int intercambioLecheEntera = 0;
    int intercambioLecheConAzucar = 0;
    int intercambioFruta = 3;
    int intercambioVerdura = 3;
    int intercambioAzucarSinGrasa = 2;
    int intercambioAzucarConGrasa = 1;
    int intercambioLeguminosa = 3;
    int intercambioCerealConGrasa = 1;
    int intercambioCerealSinGrasa = 2;
    int intercambioAlimentoMuyMagro = 3;
    int intercambioAlimentoMagro = 1;
    int intercambioAlimentoSemigraso = 0;
    int intercambioAlimentoGraso = 0;
    int intercambioAceiteSinProteina = 1;
    int intercambioAceiteConProteina = 0;

    //Metodos set

    public void setLecheDescremada() {
        lecheDescremada = (intercambioLecheDescremada * 12);
    }
    public void setLecheSemidescremada() {
        lecheSemidescremada = (intercambioLecheSemidescremada * 12);
    }
    public void setLecheEntera() {
        lecheEntera = (intercambioLecheEntera * 12);
    }
    public void setLecheConAzucar() {
        lecheConAzucar = (intercambioLecheConAzucar * 30);
    }
    public void setFruta() {
        fruta = (intercambioFruta * 15);
    }
    public void setVerdura() {
        verdura = (intercambioVerdura * 4);
    }
    public void setAzucarSinGrasa() {
        azucarSinGrasa = (intercambioAzucarSinGrasa * 10);
    }
    public void setAzucarConGrasa() {
        azucarConGrasa = (intercambioAzucarConGrasa * 10);
    }
    public void setLeguminosa() {
        leguminosa = (intercambioLeguminosa * 20);
    }
    public void setCerealSinGrasa() {
        cerealSinGrasa = (intercambioCerealSinGrasa * 15);
    }
    public void setCerealConGrasa() {
        cerealConGrasa = (intercambioCerealConGrasa * 15);
    }
    public void setAlimentoMuyMagro() {
        alimentoMuyMagro = (intercambioAlimentoMuyMagro * 0);
    }
    public void setAlimentoMagro() {
        alimentoMagro = (intercambioAlimentoMagro * 0);
    }
    public void setAlimentoSemigraso() {
        alimentoSemigraso = (intercambioAlimentoSemigraso * 0);
    }
    public void setAlimentoGraso() {
        alimentoGraso = (intercambioAlimentoGraso * 0);
    }
    public void setAceiteSinProteina() {
        aceiteSinProteina = (intercambioAceiteSinProteina * 0);
    }
    public void setAceiteConProteina() {
        aceiteConProteina = (intercambioAceiteConProteina * 3);
    }
    public double setSubtotal1() {
        subtotal1 = ( lecheDescremada + lecheSemidescremada + lecheEntera + lecheConAzucar + fruta + verdura + azucarSinGrasa + azucarConGrasa + leguminosa );
 return subtotal1;
    }
    public double setSubtotal2() {
        subtotal2 = ( cerealSinGrasa + cerealConGrasa);
 return subtotal2;    
 }
    public double setSubtotal3() {
        subtotal3 = ( alimentoMuyMagro + alimentoMagro + alimentoSemigraso + alimentoGraso);
 return subtotal3;
    }
    public double setSubtotal4() {
        subtotal4 = ( aceiteSinProteina + aceiteConProteina);
 return subtotal4;
    }
   public void setClaseCarbohidrato()
    {
        setLecheDescremada();
        setLecheSemidescremada();
        setLecheEntera();
        setLecheConAzucar();
        setFruta();
        setVerdura();
        setAzucarSinGrasa();
        setAzucarConGrasa();
        setLeguminosa();
        setCerealSinGrasa();
        setCerealConGrasa();
        setAlimentoMuyMagro();
        setAlimentoMagro();
        setAlimentoSemigraso();
        setAlimentoGraso();
        setAceiteSinProteina();
        setAceiteConProteina();
 double subtotal1 = setSubtotal1();
 double subtotal2 = setSubtotal2();
 double subtotal3 = setSubtotal3();
        double subtotal4 = setSubtotal4();
    }
}

Bueno, en esta clase como pueden ver hago algunas operaciones, estas operaciones son operaciones necesarias para el calculo de las dietas, calculan cuanta energia tiene cada alimento. Al final estos calculos ayudan para saber si la dieta esta balanceada o no. Bueno en esta clase utilicé los metodos subtotal para la prueba. 

Diseño de prueba.

La prueba unitaria la diseñé de la siguiente manera.

1.- Primero lo que hacemos es importar las librerias JUnit, estas librerias son necesarias para hacer las pruebas ya que contienen los métodos necesarios para realizar nuestras pruebas.

package proyecto;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;

2.- Realizamos nuestra clase en mi caso yo la llame Prueba, esto quiere decir que mi archivo se llama Prueba.java. Esta clase extiende TestCase que por decir vendria siendo el papá. Tenemos que declarar una variable que sea el mismo nombre del nombre de la clase de la que estamos realizando la prueba, en mi caso mi clase es Carbohidrato por esto declare Carbohidrato C. Después tenemos un método setUp el en el cual vamos a inicializar un objeto de la clase Carbohidrato.

public class Prueba extends TestCase {

 protected Carbohidrato c;
 
 protected void setUp() {
 this.c = new Carbohidrato(); 
 return;
 }
 
 public static Test suite() {  
 return new TestSuite(Prueba.class);  
 }  




3.- Ahora programamos nuestras pruebas, en mi caso yo voy a comparar double como pueden ver puse que mi double expected en el test1() es 159.0. Esto se debe a que como yo puse los valores predeterminados de los numeros de intercambio se realizaron las operaciones y sume el resultado de subtotal1. Como pueden ver en la imagen de arriba el subtotal1 viene de la formula#1 si sumamos los valores que tengo ahí sería 12.0 + 0.0 + 0.0 + 0.0 + 45.0 + 12.0 + 20.0 + 10.0 + 60.0 = 159.0. En los otros test realicé lo mismo pero con subtotal2 y subtotal3.

public void test1() {

     double expected = 159.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal1();
     assertEquals(expected,actual); 
     return;

 }
     public void test2() {
     
     double expected = 40.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal2();
     assertEquals(expected, actual);
     return;

 }
 public void test3() {
     
     double expected = 0.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal3();
     assertEquals(expected,actual);
     return;
        }


Ahora veamos el resultado de estas pruebas.






En esta prueba que realice me dice que hay un error en el test2() ya que yo puse de double expected un 40.0 pero si nos regresamos a la imagen de arriba donde tenemos los resultados de las operaciones en la Formula#2 en subtotal2 tenemos 30.0 + 15.0 y esto es igual a 45.0 no a 40.0 como yo habia puesto. Vamos a ver ya corregido esto como salen nuestras pruebas.

public void test2() {
     
     double expected = 40.0;
     c.setClaseCarbohidrato();
     double actual = c.setSubtotal2();
     assertEquals(expected, actual);
     return;

 } 


Ahora si, las 3 pruebas se realizaron con éxito y sin ningun error :). Batallé un poco en que los resultados fueran exitosos primero me salia un error que solucioné gracias a la explicación de mi compañero José en su blog ya que yo ya había puesto en el CLASSPATH todo lo que debe configurarse pero me mandaba un error a la hora de ejecutar mi prueba. Hice los pasos que vienen en el blog de José para configurar JUnit y se solucionó dicho error. También otro error que tuve era al momento de poner los métodos de las pruebas test1, test2 y test3 ponía como double expected el resultado que debía ser pero después cuando lo corría me decia que no coincidian porque el resultado que obtenía de setSubtotal1() era 0.0 luego me di cuenta que era porque tenía que correr todos los métodos que tengo en este caso setClaseCarbohidrato() donde se realizan todos los métodos de operaciones y así ya setSubtotal1() tendría el valor real de la suma, por esto en los métodos agregue setClaseCarbohidrato para que se ejecutaran las operaciones y así obtener el subtotal correcto.

Bueno esto es todo, saludos a todos :)

1 comentario:

  1. Bien. No estoy segura que son las mejores pruebas posibles, pero por lo menos funcionan y sabes usar el mecanismo para correrlas. Te pongo 4.

    ResponderEliminar