Mejora la calidad de tu software con testing

By | 08/01/2009

TestingMejorar la calidad de tu software depende también de que hagas buenos test durante su desarrollo.

Es importante tener presente en el ciclo de desarrollo las pruebas y orientarse hacia el testing para evitarse futuros e innecesarios problemas. Los test te ayudarán a encontrar errores, pero ten presente que aunque el test no falle, esto no significa que el software no contenga errores.
Como dijo ‘Dijkstra’ “…El testing prueba la presencia de errores pero no la ausencia de ellos…”

Hay que distinguir dos tipos de errores: los llamados errores de software o bugs y los errores de forma.
Los errores de forma son aquellos en los cuales el software no falla en su código pero si en su funcionalidad, es decir no cumple con lo que se espera de ellos como resultado.

Los frameworks de testing como JUnit, TestNG te ayudarán principalmente con los bugs y otro poco con los errores de funcionalidad, pero estos últimos deben ser subsanados con un buen ciclo de entregas y retroalimentación continuo del software.
Además, estos frameworks te serán de gran utilidad en entornos de aplicación ‘pesados’ donde probar el software significa, por ejemplo, levantar un servidor web.

Otro punto positivo, es que si diseñas buenas suites de pruebas, podrás luego,  ante un cambio por mantenimiento en tu software,  realizar una prueba integral de todos los módulos del mismo verificando que no hayas ‘roto’ alguna otra cosa.

JUnit es un clásico de los test, muy conocido y muy integrado a los principales entornos de desarrollo.
TestNG es otra buena opción para realizar tus pruebas.

Veamos un poco de JUnit con un simple ejemplo:

JUnit

junit-run

Esta es la consola de JUnit
junit-console

Anotaciones mas usadas:

@BeforeClass:  se ejecuta una sola vez para todos los test. Util para inicializar variables u otros datos que serán compartidos.
@AfterClass: se ejecuta una sola vez al finalizar los test.
@Before: se ejecuta previo al iniciar cada @Test.
@After: se ejecuta luego de cada @Test
@Test: metodo que será ejecutado como test.

Nuestra clase de test JUnit…
——-

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class SimpleTestJUnit {

    Calculator calc;

    @Before
    public void setUp() {
        // Before indica que debe ejecutrarse antes de iniciar el test...
        System.out.println("Ejecutando SimpleTest.setUp ...");
        calc = new Calculator();
    }

    @After
    public void after() {
        // After indica que debe ejecutrarse despues del test...
        System.out.println("Ejecutando SimpleTest.after...");
    }

    @Test
    public void testDivision() {
        System.out.println("Ejecutando SimpleTest.testDivision...");
        System.out.println(calc.getDivision(10, 3));
    }

    @Test
    public void testDivisionByZero() {
        // este test se ejecutara con error
        System.out.println("Ejecutando SimpleTest.testDivisionByZero...");
        System.out.println(calc.getDivision(10, 0));
    }

    @Test(expected = ArithmeticException.class)
    public void testDivisionByZeroWithExpectedException() {
        // Este test no dara error. Esperamos la exception ArithmeticException
        System.out.println("Ejecutando SimpleTest.testDivisionByZeroWithExpectedException...");
        System.out.println(calc.getDivision(10, 0));
    }

    @Test
    public void testPrimeNumber() {
        System.out.println("Ejecutando SimpleTest.testPrimeNumber...");
        int i = 10;
        int j = 5;
        System.out.println("Es numero primo: " + calc.isPrimeNumber(i, j));
        Assert.assertTrue(calc.getRest(i, j) == 0);
    }

    @Ignore
    @Test
    public void testIgnore() {
        // NO se ejecutara debido a que tiene la anotacion @Ignore...
        System.out.println("SimpleTest.testIgnore...");
    }

}

———–
Nuestra clase Calculator que usamos para este ejemplo es…

public class Calculator {

    public double getDivision(int v1, int v2){
        int i = v1 / v2 ;
        return i;
    }

    public double getRest(int v1, int v2){
        double i = v1 % v2;
        return i;
    }

    public boolean isPrimeNumber(int v1, int v2){
        return getRest(v1, v2) == 0;
    }

}


Ahora armaremos un suite para ejecutar varios test’s juntos…
Defines una clase con las dos anotaciones que se muestran, en una de ellas ‘SuiteClasses’ indicarás los test a ejecutar.

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses( { SimpleTestJUnit.class, SimpleTestJUnit2.class})
public class AllTests {

    public static void main(String[] args) {
        // esta clase ejecutara los test's definidos en @SuiteClasses
    }

}

——

TestNG

Si conoces JUnit te resultará mas que fácil usarlo y si no, verás que es muy parecido a JUnit
Este framework se integra a Eclipse con su plug-in

testng-run

Esta es la consola de TestNG (muy similar a la de JUnit)

testng-console


Haz click aqui para ver un test simple con TestNG …

En TestNG podemos crear también una suite de test’s.
Este xml ejecutará dos test SimpleTestNG, y SimpleTestNG2.
Solo debes ejecutarlo con el menú de TestNG

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteSimpleTests"    verbose="1" >
  <test name="GroupTest1"   >
    <classes>
      <class name="test.SimpleTestNG"/>
      <class name="test.SimpleTestNG2"/>
    </classes>
  </test>
</suite>

Como vez, los frameworks son bastante simples de utilizar, es solo cuestión de que te hagas el hábito de trabajar pensando y orientandote al testing. Pronto verás los beneficios que te trae para la calidad de tu software.
Espero te haya servido.

Enlaces: JUnit TestNG

Compartir esto:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *