Capitulo 3. Test Driven Development



Documentos relacionados
Pruebas de unidad con JUnit

Técnicas Avanzadas de Testing Automatizado

Práctica 7. Pruebas. Introducir conceptos básicos de pruebas unitarias en sistemas orientados a objetos.

Elementos requeridos para crearlos (ejemplo: el compilador)

Modificación y parametrización del modulo de Solicitudes (Request) en el ERP/CRM Compiere.

6 Anexos: 6.1 Definición de Rup:

Pruebas de unidad utilizando JUnit Juan Manuel Fernández Peña, 2005

Testing. Tipos, Planificación y Ejecución de Pruebas

Introducción al Proceso de Pruebas.

PRUEBAS DE SOFTWARE TECNICAS DE PRUEBA DE SOFTWARE

Modulo 1 El lenguaje Java

Plan de estudios ISTQB: Nivel Fundamentos

Tema 3. Test Driven Development

CORPORACIÓN MEXICANA DE INVESTIGACIÓN EN MATERIALES, S.A. DE CV

Aseguramiento de la calidad y pruebas de software

Gestión de Oportunidades

CAPÍTULO 3 Servidor de Modelo de Usuario


Capítulo II. Arquitectura del Software

Creación de Funciones de Conducción

SIIGO PYME PLUS. Proceso de Recuperación. Cartilla I

MANUAL DE USUARIO SISTEMA DE ALMACEN DIF SONORA

Programación Orientada a Objetos. Java: Excepciones

Ingeniería de Software. Pruebas

Workflows? Sí, cuántos quiere?

Visión General de GXportal. Última actualización: 2009

Introducción a la Firma Electrónica en MIDAS

Capacitación Rational Funcional Tester

Demo. TDD desde Cero. Acceptance Test Driven Development.

ing Solution La forma más efectiva de llegar a sus clientes.

Implementando un ERP La Gestión del Cambio

Lenguaje Java Avanzado

Capítulo 4 Pruebas e implementación de la aplicación CAPÍTULO 4 PRUEBAS E IMPLEMENTACIÓN DE LA APLICACIÓN

PROGRAMACIÓN ORIENTADA A OBJETOS Master de Computación. II MODELOS y HERRAMIENTAS UML. II.2 UML: Modelado de casos de uso

Actividades para mejoras. Actividades donde se evalúa constantemente todo el proceso del proyecto para evitar errores y eficientar los procesos.

Empresa Financiera Herramientas de SW Servicios

UNIVERSIDAD DE SALAMANCA

JAVA SE STANDARD EDITION

INFORMATICA Y REDES, SA DE CV.

Capítulo 4. Implementación del lenguaje multitáctil

Orígenes y descripción de la Automatización 'Inteligente'

Multipedidos es un sistema de ventas on-line que permite gestionar pedidos por internet en tiempo real de manera económica, simple y eficaz.

Ciclo de vida y Metodologías para el desarrollo de SW Definición de la metodología

3.1 INGENIERIA DE SOFTWARE ORIENTADO A OBJETOS OOSE (IVAR JACOBSON)

1.- INTRODUCCIÓN 2.- PARÁMETROS

CRM Gestión de Oportunidades Documento de Construcción Bizagi Process Modeler

A continuación resolveremos parte de estas dudas, las no resueltas las trataremos adelante

Visual Studio 2008 es el conjunto de herramientas de

IAP TÉCNICAS DE AUDITORÍA APOYADAS EN ORDENADOR (TAAO)

Capitulo I. Introducción

AUDITORIA A AMBIENTES DE DESARROLLO, APLICACIONES EN PRODUCCION, SERVICIOS DE TI, CONTRATACION DE RECURSOS DE TI. VIVIANA GÓMEZ BARCO PRESENTADO A:

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

SISTEMA CONTABLE PROMETEO

"Diseño, construcción e implementación de modelos matemáticos para el control automatizado de inventarios

ESTRATEGIA DE DISEÑO PARA LA AUTOMATIZACIÓN DE PRUEBAS UNITARIAS DE CÓDIGOS PHP UTILIZANDO EL FRAMEWORK PHPUNIT

El proceso de Instalación de Microsoft SQL Server 2008

-OPS/CEPIS/01.61(AIRE) Original: español Página Estructura del programa de evaluación con personal externo

Comisión Nacional de Bancos y Seguros

Pruebas unitarias. Que son las pruebas unitarias. Porque realizar pruebas unitarias

El programa informático más completo para la gestión del Laboratorio de Prótesis Dental

Capítulo 5. Cliente-Servidor.

App para realizar consultas al Sistema de Información Estadística de Castilla y León

SISTEMA DE GESTIÓN DE INCIDENCIAS Y REQUERIMIENTOS MESA DE AYUDA SINAT MANUAL DE USUARIO

Hacer Realidad BPM en su Organización ADOPTAR BPM A PARTIR DE UN PROYECTO O NECESIDAD DE AUTOMATIZACIÓN

Las pruebas unitarias se crean en una carpeta raíz del symfony: Test/Unit/EjemploTest.php

ENVÍO DE POR MEDIO DE SMTP

Sistema de Gestión de Proyectos Estratégicos.

e-commerce, es hacer comercio utilizando la red. Es el acto de comprar y vender en y por medio de la red.

Modelo de Objetos Distribuidos

CONSTRUCCIÓN DEL PROCESO TRANSACCIONAL Bizagi Process Modeler

Curso Excel Básico - Intermedio

Instalación y configuración de SharePoint (SPS) 2003

Guía Rápida de Inicio

Manual de Usuario Comprador Presupuesto

DESARROLLO DE SOFTWARE DE CALIDAD: EXTREME PROGRAMMING Y HERRAMIENTAS OPENSOURCE. Mª Carmen Bartolomé. mcbartolome@qualityobjects.

Gastos Reales Web Manual de Usuario

El modelo de ciclo de vida cascada, captura algunos principios básicos:

Desarrollo de Servicios Web con JBuilder

Plan de Gestión de Configuración. Universidad Nacional de la Patagonia Austral

CAPÍTULO 3 VISUAL BASIC

Programación Orientada a Objetos. Java: Excepciones

6.4 ESTRATEGIAS DE PRUEBA

DOCUMENTACIÓN DE LAS PRUEBAS DE INTEGRACIÓN

Metodologías Ágiles Desde una Perspectiva de Project Management. Fernando Contreras Velásquez Project Management & Engineering Services.

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib

Manejo de versiones 392

INFORME N GTI INFORME TÉCNICO PREVIO DE EVALUACIÓN DE SOFTWARE

Entre los más conocidos editores con interfaz de desarrollo tenemos:

Oracle 12c DISEÑO Y PROGRAMACIÓN

LiLa Portal Guía para profesores

Concurrencia. Primitivas IPC con bloqueo

CRONO SISTEMA DE CONTROL DE PRESENCIA. Software abierto. Distintas opciones para realizar las picadas. Web personal para cada usuario

ITLA Tecnólogo en Desarrollo de Software Programación II. Proyecto Final (Sistema de Bancas de Apuestas) Profesor: Raydelto Hernández Perera.

Descripción. Este Software cumple los siguientes hitos:

Curso de Spring Framework

Transcripción:

Capitulo 3. Test Driven Development 3.1 Uso de JUnit como framework para realizar pruebas unitarias Como ya se mencionó en el marco teórico Test Driven Development es una técnica de programación extrema en la cual primero se desarrollan las pruebas unitarias antes de escribir cualquier línea de código funcional. Actualmente existen varios frameworks para poder usar esta técnica, su uso depende en su mayoría del lenguaje de programación sobre el cual se trabaja. Entre ellos cabe destacar los siguientes: PHPUnit JUnitPerf HttpUnit JWebUnit Cactus JFCUnit JXUnit Jester JUnit 15

Durante la implementación de ésta tesis se usará JUnit como marco de trabajo para adoptar el uso de Test Driven Development. Kent Beck es el precursor de JUnit, en sus comienzos solo contaba con 3 clases y 12 métodos [Beck, 2004], además de estar desarrollado en Smalltalk. JUnit surgió bajo la necesidad de crear un entorno con el cual se pudieran realizar pruebas unitarias de una forma fácil, fue por ello que Kent Beck debido a un proyecto de consultaría en el que trabajaba se dio a la tarea de desarrollar toda una plataforma con la que pudiera realizar las pruebas unitarias. Después de desarrollar y entregar una estructura de soporte definida al cliente con la que pudiera automatizar las pruebas unitarias, Kent Beck notó el valor dicha estructura había adquirido durante el proceso de desarrollo del software, es por ello que comenzó a distribuirlo de forma gratuita a la comunidad de Smalltalk en el año de 1994. Para el año de 1997, durante un viaje a Atlanta a la Conferencia de Programación Orientada a Objetos, Kent Beck junto con Erich Gamma colaboran para adaptar al lenguaje Java el framework desarrollado por Beck en Smalltalk. Al final de las conferencias Martin Fowler comienza a distribuirlo. Posteriormente se convertiría en JUnit [Beck, 2004]. Después de dicho congreso y ya estando en Zurich, Beck y Gamma, André Weinand, desarrolla una interfaz gráfica AWT(Abstract Window Toolkit), para JUnit, después de ello se realiza su primer distribución. 16

Actualmente el framework cuenta con 28 extensiones en diferentes lenguajes de programación. JUnit permite a los programadores de una forma fácil y entendible quitar la barrera entre la programación y las pruebas unitarias. 3.2 Noción Básica del Uso de Test Driven Development como framework El uso de tecnologías como Test Driven Development no significa que se debe usar algún otro paradigma para realizar pruebas unitarias durante el proceso de desarrollo de software. Para ello se demostrará con un pequeño ejemplo el uso de esta técnica. En este caso se quiere saber cuál es el tamaño de un arreglo de elementos, por lo tanto se espera que la prueba después de agregar ciertos elementos al arreglo muestre su tamaño actual. La forma más sencilla de realizar dicha verificar el tamaño de dicho arreglo es el imprimir el tamaño del arreglo antes y después de que se dé añaden elementos al arreglo. mencionado. A continuación se presenta el código en Java que imprime el tamaño del arreglo Arraylist test = new Arraylist(); System.out.println( Antes de agregar elementos al Array: +test.size() ); test.add( elemento 1 ); test.add( elemento 2 ); 17

System.out.println( Tamaño despues de agregar elementos al Array: +test.size() ); Para hacer un poco más eficiente la prueba anterior lo que se va a hacer es el agregar una condición en primer término para verificar si el arreglo comienza en cero y después para verificar si dicho arreglo cuenta con 2 elementos, dichas condiciones serán impresas y se verificará si se cumplen o no dichas condiciones, por lo tanto se imprimirá un true o un false. Enseguida se presenta la variante al código: Arraylist test = new Arraylist(); System.out.println( El arreglo comienza en 0: + test.size() == 0 ); test.add( elemento 1 ); test.add( elemento 2 ); System.out.println( El arreglo tiene 2 elementos: +test.size() == 2 ); Finalmente para que nuestro primer ejemplo quede listo se creará un método que lanzará una excepción en caso de recibir un false de la condición que se envía como parámetro, con este método en caso de que el valor esperado no sea correcto se lanzará una excepción indicando que la prueba unitaria no ha sido exitosa. Agregando el método mencionado la primera prueba unitaria usando Test Driven Development quedaría de la siguiente forma: Arraylist test = new Arraylist(); 18

asserttrue(test.size() == 0); test.add( elemento 1 ); test.add( elemento 2 ); asserttrue(test.size() == 2); //método asserttrue(boolean condicion) void asserttrue(boolean condicion) throws Exception { If(! condicion) throw new Exception( Prueba unitaria fallida ); } Debido a que un programa considerable está compuesto de más de una sola prueba unitaria, es necesario crear toda una infraestructura que JUnit ya posee. Tal como lo presenta Cabalar el proceso de creación de pruebas unitarias usando JUnit es el siguiente [Cabalar, 2008]: 1. Creación de un test, el cual debe fallar ya que aun no se cuenta con el código funcional. 19

2. Creación del código funcional 3. Corrección del test, y modificación para que el test sea exitoso. 4. Repetición de los 3 primeros pasos, durante la etapa de codificación de software. JUnit posee su propia implementación, sin embargo actualmente se encuentra integrado en los siguientes IDE s de desarrollo de software: Eclipse BlueJ IntelliJ IDEA NetBeans Para los propósitos de ésta tesis se uso la integración con el entorno de desarrollo NetBeans 5.5. La versión de JUnit usada es la versión 3.8.1. Algunas reglas básicas para la implementación de JUnit para la realización de pruebas unitarias son las siguientes: Toda clase de prueba debe extender de la clase TestCase : public class CSVImporterTest extends TestCase Todo método de prueba dentro de la clase de prueba debe comenzar con test: public void testloadtablename() throws Exception 20

A continuación se detalla la utilización del JUnit en el desarrollo de la presente tesis. Para cada uno de los puntos funcionales del sistema se creó una clase de pruebas en el cual se implementaron las pruebas unitarias necesarias. En la imagen 3.2.1 se muestra el paralelismo. Imagen 3.2.1 Creación de clase de pruebas usando JUnit Cada clase de prueba contiene los siguientes elementos: 21

Extiende de la clase TestCase. Implementan el método suite(), el cual se encarga de ejecutar solo los métodos llamados desde éste método. En la imagen 3.2.2 se muestra el código del método suite de una clase de prueba. Figura 3.2.2 Método suite() Implementan el método setup() que se encarga de inicializar variables y objetos usados durante ejecución de la clase de pruebas unitarias. En la figura 3.2.3 se muestra el uso del método setup(). 22

Figura 3.2.3 Método setup() Implementan el método teardown() que tiene la función de recolector de basura de los objetos y variables inicializadas durante la método setup() y durante la ejecución de la clase de pruebas. Implementación de cada uno de los métodos que contienen las pruebas unitarias para el código funcional. Cabe destacar que para que un método de prueba sea exitoso o no, son usados los métodos assert, tanto para comparar los valores esperados contra los valores reales, o 23

directamente hacer que el método de prueba falle. En la tabla 3.2.4 se describen los métodos implementados del JUnit. Método assert de JUnit Comprobación a realizar asserttrue(expresión) Verifica que la expresión se evalúe en true, en caso contrario marca un fallo en el método de prueba. assertfalse(expresión) Verifica que la expresión se evalúe en false, de lo contrario el método de prueba falla. assertequals(valor esperado, valor real) Verifica que el valor esperado sea igual al valor real, de lo contrario el método de prueba falla. assertnull(objeto) Verifica que el objeto sea nulo, de lo contrario el método de prueba falla. assertnotnull(objeto) Verifica que el objeto no sea nulo, de lo contrario el método de prueba falla. 24

assertsame(objeto esperado, objeto real) Verifica que el objeto esperado sea igual al objeto real, de lo contrario el método de prueba falla. assertnotsame(objeto esperado, objeto real) Verifica que el objeto esperado sea diferente al objeto real, en caso contrario el método de prueba falla. fail() Forza que el método de prueba finalice con un fallo. Tabla 3.2.4 Métodos assert() En la figura 3.2.5 se muestra un método de prueba usado en ésta tesis. Figura 3.2.5 Metodo de prueba usando JUnit 25

3.3 Características de JUnit Algunas de las características más importantes de JUnit para el desarrollo de pruebas unitarias son las siguientes: Ejecución de las pruebas de forma automática. Ejecución de varias pruebas de forma simultanea Provee un lugar para poder concentrar el resultado de todas las pruebas [Beck, 2004]. Fácil manejo de la herramienta ya que proporciona los resultados esperados y los resultados actuales y ofrece un reporte de la ejecución de las pruebas. Con la realización de las pruebas unitarias al código funcional, se está asegurando los requerimientos del cliente sean los deseados. Provee soporte para los desarrolladores de cómo modificar el sistema sin alterar el comportamiento actual del sistema en cuestión [Storani, 2008]. Sirve como documentación sobre el funcionamiento del sistema para los desarrolladores [Storani, 2008]. El uso de este framework permite que los sistemas sean más adaptables al cambio debido a que es mucho más fácil detectar y aislar las pruebas unitarias realizadas a cada parte del sistema. 26

3.4 Limitaciones del Framework Algunas limitaciones del uso de Test Driven Development son: El uso de TDD es difícil en situaciones en las que se requieren pruebas completas de funcionalidad del sistema, por ejemplo en el uso de GUI s, programas que trabajan con Bases de Datos relacionales y algunos que trabajan en diferentes configuraciones de red [Storani, 2008]. Si la gerencia de los proyectos no está convencida de que mediante el uso de TDD se mejorara el producto final, solo lo verán como una pérdida de tiempo [Storani, 2008]. Las pruebas en el desarrollo de software tiene una menor importancia que el desarrollo o la arquitectura de software, un ejemplo de ello es el Visual Studio 2005 Architect Edition, el cual carecía de las facilidades ofrecidas en la Testing Edition [Storani, 2008]. Las pruebas deben ser parte del completo mantenimiento de un proyecto, ya que las pruebas mal diseñadas y codificadas son propensas a convertirse en fallas que son difíciles de mantener, por lo tanto importante diseñar y codificar test de bajo y fácil mantenimiento [Storani, 2008]. 27