7
PRACTICA 1 ¿Qué es Junit? Introducción Junit es un framework de pruebas para el Lenguaje de programación de Java. Esto es importante en manejo de pruebas para el desarrollo de aplicaciones, y es un framework colectivo de pruebas conocidos como xUnit. Junit promueve la idea de “primero prueba, después codifica”, enfatizando la configuración para prueba de datos para un bloque de código el cual puede ser probado primero y después implementado. Está aproximación es como “prueba un poco, codifica un poco...” la cual incrementa la productividad y estabilidad del programador para el programa que hace, disminuyendo el estrés y el tiempo que pudiera llevarle hacer la depuración. Funcionalidades Junit es un framework de código abierto que se usa para escribir y ejecutar casos de prueba. Provee una Anotación para identificar los métodos de prueba. Provee Asserciones para verificar los datos esperados. Provee ejecuciones de prueba para ejecutar las pruebas de software. Junit permite escribir código más rápido lo cual incrementa la calidad. Junit es simplemente elegante. Es poco complejo y requiere poco tiempo. Junit puede ejecutarse automáticamente y verificar sus propios resultados y proveer retroalimentación inmediata. No hay necesidad de arreglar los resultados de prueba a través de un reporte. Las pruebas con Junit pueden ser organizadas en suites de Casos de prueba. Junit muestra una barra de progreso de las pruebas que conforme las va pasando pone la barra de color verde y si falla la prueba muestra la alerta de color rojo. ¿Qué es una unidad de un caso de prueba(Test Case)? Una unidad de caso de prueba es una parte de código que asegura que otra parte del código (un método) funcione como se espera. Para alcanzar estos resultados deseados rápidamente, se requiere un framework de pruebas. Junit es un framework perfecto para unidades de prueba para el lenguaje de programación Java. Una unidad de caso de prueba formalmente escrito se caracteriza por una entrada conocida y una salida esperada, la cual se trabaja a la salida cuando la prueba se ejecuta. La entrada conocida debe probar una precondición y la salida esperada debe probar la postcondición. Deben existir al menos 2 unidades de caso de prueba para cada requerimiento: una prueba positiva y una negativa. Si un requerimiento tiene sub-requerimientos, cada sub-requerimiento debe contar con al menos dos casos de prueba positivos y negativos.

Practica i junit

Embed Size (px)

Citation preview

Page 1: Practica i junit

PRACTICA 1

¿Qué es Junit?Introducción

Junit es un framework de pruebas para el Lenguaje de programación de Java. Esto esimportante en manejo de pruebas para el desarrollo de aplicaciones, y es un framework colectivo depruebas conocidos como xUnit.

Junit promueve la idea de “primero prueba, después codifica”, enfatizando la configuraciónpara prueba de datos para un bloque de código el cual puede ser probado primero y despuésimplementado. Está aproximación es como “prueba un poco, codifica un poco...” la cual incrementala productividad y estabilidad del programador para el programa que hace, disminuyendo el estrés yel tiempo que pudiera llevarle hacer la depuración.

Funcionalidades

• Junit es un framework de código abierto que se usa para escribir y ejecutar casos de prueba.• Provee una Anotación para identificar los métodos de prueba.• Provee Asserciones para verificar los datos esperados.• Provee ejecuciones de prueba para ejecutar las pruebas de software.• Junit permite escribir código más rápido lo cual incrementa la calidad.• Junit es simplemente elegante. Es poco complejo y requiere poco tiempo.• Junit puede ejecutarse automáticamente y verificar sus propios resultados y proveer

retroalimentación inmediata. No hay necesidad de arreglar los resultados de prueba a través de un reporte.

• Las pruebas con Junit pueden ser organizadas en suites de Casos de prueba.• Junit muestra una barra de progreso de las pruebas que conforme las va pasando pone la

barra de color verde y si falla la prueba muestra la alerta de color rojo.

¿Qué es una unidad de un caso de prueba(Test Case)?

Una unidad de caso de prueba es una parte de código que asegura que otra parte del código(un método) funcione como se espera. Para alcanzar estos resultados deseados rápidamente, serequiere un framework de pruebas. Junit es un framework perfecto para unidades de prueba para ellenguaje de programación Java.

Una unidad de caso de prueba formalmente escrito se caracteriza por una entrada conocida yuna salida esperada, la cual se trabaja a la salida cuando la prueba se ejecuta. La entrada conocidadebe probar una precondición y la salida esperada debe probar la postcondición.

Deben existir al menos 2 unidades de caso de prueba para cada requerimiento: una pruebapositiva y una negativa. Si un requerimiento tiene sub-requerimientos, cada sub-requerimiento debecontar con al menos dos casos de prueba positivos y negativos.

Page 2: Practica i junit

PASO 1)

Junit requiere la versión para desarrollo JDK 1.5. Para verificar que cuenta con la versióncorrecta teclee en su máquina:

$> java -versionPara estar seguro de que su variable de entorno “JAVA_HOME” esta bien definida lleve a

cabo la siguiente operación Set environment variable JAVA_HOME to C:\ProgramFiles\Java\jdk1.6.0_21.

Agregue el compilador de Java al Path C:\Program Files\Java\jdk1.6.0_21\bin al final de la variable de sistema Path.

Para la variable de entorno “JUNIT_HOME” haga lo mismo que con la variable “JAVA_HOME” solo hágalo para su ruta respectiva, por ejemplo: C:\JUNIT.

Verifique con el comando “set” los cambios anteriores. Si va a usar algún IDE, omita este paso.

PASO 2) A continuación se debe tener una clase con métodos, los cuales usted desea verificar que lleven a cabo su ejecución como espera, es decir que la salida se la esperada a ver al ejecutarse su código, para ellos escriba la siguiente clase, parte de la cual le ha sido ya enviada vía email.

Calculation.java

package org.j2eedev.calc;public class Calculation { public static int suma(int a, int b){ return a+b; } public static int resta(int a, int b){ return a-b; } public static int multiplica(int a, int b){ return a*b; } public static int divide(int a, int b){ return a/b; }}

Todos los métodos de los casos de prueba, es necesario ponerles de prefijo “test” para una mejor identificación de los mismos, esto se considera una buena práctica.

A continuación se listan las anotaciones usadas para Junit:

Page 3: Practica i junit

Anotación Descripción

@Test public void method() La anotación @Test identifica que un método es un método de prueba.

@Before public void method()

Este método se ejecuta antes de cada prueba. Este método puede prepara el ambiente de prueba (e.g. Leer dato de entrada, inicializar la clase).

@After public void method()

Este método se ejecuta después de cada prueba. Este método puede limpiar el ambiente de prueba (e.g. Borrar datos temporales, restaurar valores predeterminados). También puede ahorrar memoria limpiando estructuras que se esten alojando en memoria y no son ya necesarias.

@BeforeClass public static void method()

Este método se ejecuta una vez, antes de todas las pruebas. Este se puede usar para realizar actividades muy intensas en tiempo, por ejemplo para conectarse a una base de datos. Los métodos con esta anotación necesitan ser definidos como static para trabajar con JUnit.

@AfterClass public static void method()

Este método se ejecuta una vez, después de que todas las pruebas se han llevado a cabo. Este puede ser usado para desempeñar actividades de limpieza, por ejemplo: desconectarse de una base de datos. Métodos con esta anotación necesitan ser definidos como static para trabajar con JUnit.

@IgnoreIgnora el método de prueba. Esto es muy útil cuando código de otras capas se ha cambiado y el caso de prueba aún no ha sido adaptado al cambio. O siel tiempo de ejecución de la prueba es demasiado largo para ser incluido.

@Test (expected = Exception.class)

Falla si el método no arroja la excepción nombrada.

@Test(timeout=100) Falla si el método se lleva más de 100 milisegundos.

Junit provee métodos estáticos de la clase Assert para ciertas condiciones. Estos métodos de aserciones empiezan típicamente con el prefijo “assert” y permiten que uno especifique el mensaje de error y el resultado actual. Un método de aserción compara el valor actual regresado por una prueba por el valor esperado que se le especifico y arroja una excepción AssertionException si la comparación falla.

Estatuto Descripción

fail(String)Permite que el método falle. Puede ser usado para verificar que una cierta parte del código no se alcance a ejecutar. O para tener una prueba de falla antes de que el código sea implementado.

assertTrue([message], boolean condition)

Verifica que la condición booelana sea cierta.

assertsEquals([String message], expected, actual)

Prueba que dos valores son iguales. Nota: para arreglos se verifica la referencia no el contenido del arreglo.

assertsEquals([String message], expected, actual, tolerance)

Prueba que el valor flotante o doble sean los mismos. La tolerancia es que el número de decimales sean los mismos.

assertNull([message], object) Verifica que el objeto es nulo.

assertNotNull([message], object) Verifica que el objeto no sea nulo.

assertSame([String], expected, actual)

Verifica que ambas variables se refieran al mismo objeto.

Page 4: Practica i junit

Estatuto Descripción

assertNotSame([String], expected, actual)

Checks that both variables refer to different objects.

Los principales métodos de la clase Assert son:

1void assertEquals(boolean expected, boolean actual)Verifica que 2 primitivas/Objectos sean iguales

2void assertFalse(boolean condition)Verifica que una condición es falsa

3void assertNotNull(Object object)Verifica que un objeto no sea nulo.

4void assertNull(Object object)Verifica que un objeto es nulo.

5void assertTrue(boolean condition)Verifica que una condición sea verdadera.

6void fail()Falla una prueba sin usar mensaje.

La clase TestCase tiene los siguientes métodos:

1int countTestCases()Cuenta el numero de casos de prueba a ser ejecutados por el método run()(TestResult result).

2TestResult createResult()Crea un objeto predeterminado de la clase TestResult.

3String getName()Obtiene el nombre del TestCase.

4TestResult run()Un método conveniente para ejecutar esta prueba, colecciona los resultados con el objeto predeterminado de la clase TestResult.

5void run(TestResult result)Ejecuta el caso de prueba y colecta los resultados en TestResult.

6void setName(String name)Configura el nombre del TestCase.

7void setUp()Configura el inicio, por ejemplo: abrir una coneción de red.

8void tearDown()Arregla el ambiente de trabajo, por ejemplo: cierra una conexión de red.

9String toString()Regresa un string que representa el caso de prueba.

Page 5: Practica i junit

PASO 3) CASO DE PRUEBA

Escriba el siguiente código con los casos de prueba especificados:

MathTest.java

package org.j2eedev.math;import junit.framework.TestCase;import org.j2eedev.calc.Calculation;public class MathTest extends TestCase{ private int value1; private int value2; public MathTest(String name){ super(name); } public void setUp() throws Exception{ super.setUp(); value1=3; value2=5; }

public void tearDown() throws Exception{ super.tearDown(); value1 = 0; value2 = 0; } public void testAdd(){ int total = 8; int sum = Calculation.suma(value1, value2); assertEquals(sum,total); } public void testFailedAdd(){ int total=9; int sum = Calculation.suma(value1, value2); assertNotSame(sum,total); } public void testSub(){ int total =0; int sub = Calculation.resta(4,4); assertEquals(sub,total); }}

Page 6: Practica i junit

PASO 4) BinString.java

// Clase que suma strings basado en sus valores ASCII de sus// caracteeres y luego regresa la representación binaria de la suma.public class BinString { public BinString() {}

public String convert(String s) { return binarise(sum(s)); }

public int sum(String s) { if(s=="") return 0; if(s.length()==1) return ((int)(s.charAt(0))); return ((int)(s.charAt(0)))+sum(s.substring(1)); }

public String binarise(int x) { if(x==0) return ""; if(x%2==1) return "1"+binarise(x/2); return "0"+binarise(x/2); }}

Copia el código a tu IDE y guardalo con ese nombre, este programa convierte un string en ASCII a la suma de sus caracteres con sus valores representativos como un String binario,la razón de usar este tipo de función fue arbitrario, sólo se quiere ilustrar las pruebas para un programa con métodos auxiliares. Copie también el código de abajo a su carpeta de pruebas.

BinStringTest.javaimport junit.framework.*;public class BinStringTest extends TestCase { private BinString binString;

public BinStringTest(String name) { super(name); }

protected void setUp() { binString = new BinString(); }

public void testSumFunction() { int expected = 0; assertEquals(expected, binString.sum("")); expected = 100; assertEquals(expected, binString.sum("d")); expected = 265; assertEquals(expected, binString.sum("Add")); }

public void testBinariseFunction() { String expected = "101"; assertEquals(expected, binString.binarise(5)); expected = "11111100"; assertEquals(expected, binString.binarise(252)); }

Page 7: Practica i junit

public void testTotalConversion() { String expected = "1000001"; assertEquals(expected, binString.convert("A")); }}

EJERCICIO:1) Al ejecutar el siguiente código, deberán ejecutarse 3 casos de prueba. Identifique donde estuvo la falla. ¿En que función fallo se detecto el fallo? ___________________________________.

2) Modifique la función en que ocurrió la falla para que no se presente este error, escriba el refurbish del método:

3) Recompile y ejecute, escriba el numero que obtuvo para: Test run ______, Failures _________, & Errors: _______.

4) Explique a que se deben los errores presentados en la prueba y proponga una manera de corregirlos.