El testing siempre ha sido una parte integral del desarrollo de software. Sin embargo, el camino del testing ha sido llevado ha cambios significativos a lo largo de década. Como programadores, hemos tenido siempre interés en conocer qué nuestro software trabaja, antes de que sea pasado a los usuarios . Lo que significa que obtenemos conocimiento, sin embargo, ha evolucionado obteniendo software ágil de desarrollo como es la Programación Extrema.
Adicionalmente, el rol del test de ellos mismos, ha modificado entre otras áreas del desarrollo de software, planificando la verificación para confirmar para especificar. En efecto, la solución para el segundo tiempo de nuestro problema de código es omitirlos, para encontrarse con la actual necesidad es permitir test manejados sobre el desarrollo a nivle de la construcción y funcionalmente en la construcción del sistema. Es decir, practicamente test de aceptación sobre el desarrollo. En conclusión, "Hacemos sólo pruebas de ejecución en una parte del sistema cuando los test son llamados".
En esecencia, significa que los test no son llamados meramente una verificación de instrumentos, si no como una parte integral de requerimientos y especificacion así comop también un medio para colaborar con el negocio.En esta sección , iremos introduciéndonos en más detalle sobre esos nuevos roles de los test, comenzando con examinar y nutrir la estrecha colaboración entre el desarrollo , tester , y negocio , y discutir el uso de los test como un lenguaje compartido facilitando la colaboración.
Antes de discutir los aspectos de la técnica de la colaboración orientada, debemos relacionar la relación entre los test de aceptación y TDD. Después de todo, sus nombres son apenas idénticos.
1.4.1 Cuál es su nombre?El nombre "test de aceptación" implica que la aceptación de TDD es igualmente algo similar para "regular" TDD. El sufijo es obviamente procede de TDD, pero de donde viene el resto? Qué es test de aceptación? En conclusión , test de aceptación son indicadores de la completación de un requerimiento o aspecto. Todo test de aceptación para un requerimeinto o presentación pasada, permite saber lo que hace.
TDD de aceptación es una técnica , no es una combinación para especificar formas para expresar requerimientos. La misma idea puede ser aplicada para algunos efectos tanto como implementando casos de uso, historias , o otros medios equivalentes para documentar lo que tiene que hacer. Esto denota un valor, es decir, ese equipo usando historias para administrar sus requerimientos tienden a llamarlo "historias de test en ejecución de desarrollo" en cambio - cúal es un nombre diferente para alguna técnica. A pesar de eso otros prefieren llamarlo " test de ejecución de desarrollo de negocio", lo cual es apropiado considerando la naturalidad del test.
Nota: Sin embargo TDD y TDD de aceptación tiene mucho en común y ciertamente el hermano mayor tiene mucho que parender de su hermano menor, pero ambos TDD Y TDD de aceptación pueden ser adoptados en forma excluyentes. Los programadores que no tienen historias de usuarios a la vista que aún no pueden hacerlo para una funcionalidad determinada, todavía pueden adoptar TDD y cosechar sus beneficios tales como; equipos de prueben previamente antes de integrar funciones. Esta práctica producen una mejora más que el uso de cualquiera de ellos solos.
Independientemente del formato específico o herramienta que utilizamos para gestionar los requisitos, el principla objetivo de la Aceptación TDD es, apoyar la colaboración estrecha entre el cliente y el equpo de desarrollo. Vamos a ver como está basado en pruebas.
1.4.2 La estrecha colaboraciónEstrecha colaboración es escencial para cualquier esfuerzo complejo que invlucre a personas y desarrollo de software con TDD de aceptación. En la práctica se requiere tener un equipo de proyecto integrado de desarrollo, en empresas, análisis, pruebas de equipos y departamento de control de calidad.
La idea fundamental es alcanzar el mejor nivel de productividad para todo el equipo, alimentando una respuesta rápida y eficaz cara a cara, con una buena comunicación, software de trabajo que impidan las pruebas planas, especificaciones e informes de incidencias entre los clientes, usuarios, analistas de negocios y desarrolladores. Con TDD de aceptación , somo capaces de colaborar efectivamente y reunir conocimientos , destrezas y habilidades necesarias para hacer un buen trabajo.
Veamos como la estrecha colaboración ayuda a liberar un producto correcto con la mejora de nuestras iteraciones reduciendo la probabilidad de incidencias.
Viendo concretamente el trabajo de software
Existen clientes despues de varios meses, demuestran no estar contentos o satisfechos con entregas de trabajo de contratistas.Informar al cliente con entregas continuas de funcionalidades, estamos asegurandonos de que, si hay algo incorrecto o no, lo sabremos de inmediato. Esta temprana retroalimentación reduce riesgos y costos. Además al no llevar un inventario, donde se detalle de las funcionalidades terminadas , estamos evitando mostrar el progreso del desarrollo, como por ejemplo "desarrollo es de 90% completo"
Creando confianza y confianza Otro beneficio que se gana al realizar entregas tempranas de trabajo de software y con frecuencia es que estamos contruyendo confianza, tanto entre el equipo y el cliente como dentro del mismo equipo. Al mostrar a lo clientes (y a nosotros mismos) que podemos entregar iteraciones de versiones, estamos haciendo la vida mucho más fácil para todo nuestro equipo.
El cliente tiene el control
Hay una diferencia clave en el rol y poder entre los desarrollos incrementales y el desarrollo tradicional de casacada del cliente. Pues, con el desarrollo incremental el cliente elige y busca las características principales. Del mismo modo, elige las características que puede eliminar, no disponibles para ser implementadas y que estan dentro del proyecto asignado en tiempo o presupuesto.
Las decisiones de los clientes son, seguros, influenciado por el costo de las caracteríticas, que por las estimaciones de los desarrolladores- incluyendo el costo de las demoras, construcción, orden , etc.
La capacidad del cliente en tomar decisiones en que se gasta sus dinero y cambiar su forma de mirar a los proyectos de software. Por último, el cliente tiene el control. Hable sobre cómo motivar a los clientes¡¡
La evolución de un trabajo compartido
Al fomentar una estrecha colaboración entre los testeadores , desarrolladores y clientes, somos efectivos facilitadores a una situación donde la información necesaria se obtiene tan pronto como sea posible -en todas las direcciones. Además, esta exposición es continúa en el equipo aumentando la eficiencia en la comunicación como el conocimiento entre los desarrolladores generando un lenguaje compartido. El desarrrollo de software es un negocio de personas y no debemos descuidarnos en ello.
Vamos a ver la posibilidad de usar test de aceptación usando como fundamento un lenguaje compartido incluyendo a cliente y al equipo de desarrollo y tester.
1.4.3 Test como un lenguaje compartido
Uno de los mayores problemas en el desarrollo de software es no tener claridad de los requerimientos o necesidades del cliente. Esto deja de ser un juego de niños para expresar y comunicar los requisitos de tal forma que ninguna información pierda la transmisión de la idea original. Algunos dicen a lo lejos que es imposible realizarlo. Despues de todo , no podemos leer la mente de nuestros clientes.
Este problema es evidente cuando usamos un medio de comunicación es por medio de una documentación escrita- por ejemplo, especificaciones de requerimientos- lo cual es lejos un medio perfecto para la transferencia y comprensión de la información. Si pudieramos ser capáz de trasnformar los requisitos en pruebas ejecutables y que verificaran si el sistema se ajusta a las aspectos y condiciones particulares, habría menos problemas con las ambiguedades y el espacio entre la interpretación y los desarrolladores. Esta es la premisa perfecta de los test como especificaciónes.
Test de Pruebas como especificaciones.Los test como especificaicones provee una manera de de ver las pruebas como algo esencial que se derivan de los requisitos, por lo que en teoría, un sistema que pasa sus pruebas , se ajustan a la especificación.
De vez en cuando, obtenemos defectos a través de pruebas. Esto no es novedad para quienes hemos estado a lo menos en dos proyectos de software comercial. Esto se debe por no considerar todas las pruebas las pruebas necesarias. En parte , esto se debe a nuestra naturaleza humana y nuestra intuición engañosa, donde , sólo se resuleven algunas incidencia para ahorra tiempo.
Esto nos plantea la pregunta, ¿Estamos realmente usando los test como especificaciones , si los tests tienden a fugarse por otros caminos? Esto es realmente factible para el uso de los test como especificaciones, efectivamente redifiniendo el significado de los conceptos?. Usando test como especificaciones no es una bala de plata, pero tiene una serie de ventajas que valen la pena considerar.
- Más rápido a través de la automatización.
- Ejecución de pruebas más confiables.
- Menos pasos.
En primer lugar, no se puede negar que al tener automatizadas las pruebas ejecutables, nos deshacemos de un montón de duro trabajo, acelerando las iteraciones enormemente, si lo comporamos si lo realizamos manualmente.En segundo lugar, evita la negligencia de pereza que poseemos los humanos. Finalmente , hacemos de los errores una traducción de los verdaderos requerimientos en la escritura con verdaderas prácticas.
Aún en la transformación de requerimientos en los test , existen la posibilidad de errar. pero, la transferencia de conocimientos y la interpretación humana implica la ejecución de los test con menos cambios en los lugares donde se ha diseño.
Ejemplo de especificación.Uno de los beneficios más notables del uso de pruebas como especificaciones, es el impulso de desarrollar pruebas típicas que empleen especificaciones no abstrata en escritura, es decir, en vez del tradicional "el sistema deberá calcular el impuesto de...." como patrón de los documentos de requerimientos, sino especificaciones como por ejemplo "para una suscrpción de 20 dólares con un tipo impositivo del 10%, el sistema carga un total de 22 dólares de la cuenta del usuario"
Este simple requerimientos, se diferencia entre el tradicional "el sistema debera..." y el ejemplo basado en versiones no tan significativas- después de todo , sabemos como calcular el impuesto como caso trivial, Sin embargo, los requerimientos para cumplir con el trabajo no suelen ser tan triviales, y el riesgo de mantenerlos es mucho más alto. Por ejemplo, la aplicación de impuesto múltiples para una operación determinada, puede ser que necesite emplear diferenctes reglas en diferentes lugares, que pueden ser aclarados a través de ejemplos concretos.
La especificaciones es un paso natural de nuestra intuición y hace más fácil relacionar los requerimientos para el mundo concreto en nuestro software. Las especificaciones también se pueden ver en TDD. Considerando que las pruebas de aceptación especifican el comportamiento deseado del sistema, los ejemplos y el comportamiento deseado especificado con las pruebas unitarias especifican acerca de la apliclación deseada y no de la funionalidad entregada.
Mayor calidad por dentro y fuera, mejor confianza en nuestro trabajo, y al cliente queda complacido frente a un software ajustado a sus necesidades. Después de todo, todo es posible. Luego haremos nuestra propia caminata o conversación pero, primero hablaremos de las herramientas a nuestra disposición.
1.5 Herramientas para el desarrollo de ejecución de testLas herramientas son importantes. Sin herramientas como compliladores, editores, sistemas de explotación , desarrollo de software sería difícil comparádolo donde han llegado décadas y décadas de avances técnicos. Ahora vamos a tomar tres categorías fundamentales de herramientas y técnicas: un frameworks de testing unitarios, integración contínua con mecanismo de apoyo y, cobertura de código.
1.5.1.- Pruebas unitarias con xUnitHace años, Kent Beck creó un framework de pruebas unitarias para SmallTalk llamado SUnit (http://sunit.sf.net). Este framework ha sido la luz para circular dentro de la comunidad de desarrollo de software.Esta misma herramienta basada en SUnit - es llamada también JUnit, disponible en http:/www.junit.org/ . La familia de los frameworks de pruebas unitarias basados en los patrones encontrados en SUnit y JUnit es similar a xUnit. ¿Qué hacen exactamente?
¿Qué hace exactamente el framework de pruebas unitarias en el contexto de xUnit?, Significa que la librería ofrece apoyo para escribir código de pruebas unitarias, ejecutarlas sobre los resultados de prueba. En el caso de Junit, proporciona un conjunto de clases e interfaces para tareas comunes aserciones , y así sucesivamente. Para ejecutar los JUnit escritos en Junit, el proyectos provee de diferentes test runners- son clases que saben como coleccionar un ser de pruebas unitarias , los ejecuta , colecciona los resultados , y muestra el desarrollo gráficamente o resumen de resultado.
En este libro veremos JUnit y Java. De hecho usaremos varias ampliaciones de JUnit a medida que avanzamos en una prueba de manejo diferentes tipos de componentes. Si usted no está familiarizado con JUnit, por favor, refiérase a los apéndices de una introducción a esta pequeña y maravillosa herramienta. No demasiados inmersos en los detalles de JUnit, tenemos un par de categorías adicionales de las herramientas para ejecutar las pruebas de aceptación de TDD.
1.5.2 Framework para test de TDD de aceptación.
Aunque los frameworks de los escenarios de test unitarios, se ha desarrollado bajo el concepto de xUnit, no es tan homogéneo en el mundo de las pruebas de aceptación. La principal razón de esta diferencia es la idea de una prueba de manejo en el nivel funcional ya que es relativamente nuevo, y la ejecución iterativamente de las pruebas con herramientas de automatización no funcionan bien cuando no hay nada para grabar.
Otra cosa al pensar sobre la fragmentación del negocios es, el factor de dos sistemas rara vez tienen la mismas interfaces exacta. La excepción a la regla es la aplicación web, la cual puede ser accesadas con tecnologías estándar, como el protocolo HTTP y el lenguaje de tag HTML. Lo que es más importante que las tecnologías involucradas, son las herramientas destinadas a apoyar nuestro ineterés primordial con TDD de aceptación- cierra el negocio de colaboración.
Existen herramientas como FIT y FITnesse que son orientadas a tablas visuales que colaboran con los desarrolladores, testeadores y analistas de negocio no técnicos. Fit usa un formato tabular con una familia de herramientas , que permiten escribir pruebas ejecutables que representan pruebas como declaraciones. Una de las herramientas más conocidas de esta categoría es EXACTOR. A veces es sufiente para los fines de un proyecto dado utilizar un medio más técnicos, como un lenguaje de secuencias de comandos para describir pruebas. Es un framework para pruebas de aceptación , de fácil acceso, otra opción es manejar un framework de propia cosecha.
Vamos a ver más de cerca algunas de estas herramientas en la parte 3 al explorar la aceptación basado en pruebas en un mayor desarrollo. Por ahora , pasaremos a la siguiente herramienta relacionada que deben cubrir a los continuos servidores.
1.5.3.- Integración contínua y constructores.Trabajar en un equipo que está en constante cambio en el código aqui y allá, crea una presión en los desarrolladores para integrar sus cambios significativos. algunos utilizados en entornos tradicionales. Los equipos que utilizan TDD emplean la por propiedad el código colectivo, lo que significa que todos estan autorizado para cambiar cualquier código base.
En la práctica, esto significa que mientras el equipo está refactorizando como parte de su ciclo de pruebas, habrá un flujo constante de pequeños cambios en el repositorio de código fuente. Con esto en mente, esperando a que dos días antes se chequen tus cambios e igualmente los requerimientos manualmente- esta es una actividad que no gusta mucho.
Todo esto nos lleva a adoptar un proceso sincronizado en nuestros cambios en el repositorio de fuentes con más frecuencia que antes. La alta frecuencia de integración
de los desarrollos, da un espacio a los desarrolladores en un repositorio centralizado, donde no solo cabe la integración de la fuente en la compilación sino también en la verificación de la fuente integrada mediante la ejecución de pruebas automatizadas.
Ventajas y DesventajasUn patrón común con los equipos de aplicación contínua es ejecutar un subconjunto de todas las pruebas antes de comprobar en sus cambios y delegar en funcionamiento de la suite de pruebas (incluyendo la unidad, integración y pruebas funcionales) a un servidor dedicado a contruir, también conocido como una acumulación contínua con el servidor. En la figura 1.12 muestra una configuración básica con un servidor de integración contínua de votación para los cambios de el repositorios de código fuente.
En escencia , esta es una práctica que muchos equipos deciden hacer. Por un lado hacer correr las suit de test demora un varios minutos que esperar la barra verde, es decir que los test se hayan ejecutados sin problemas.
En el caso que los cambios puedan romper alguna prueba del desarrollador, no hay que ejecutarlos sin antes notificarlos al resto del equipo y verificar la base de código donde fué roto los cambios recientes.
Construir servidores con servicios variosAfortunadamente usted no necesita escribir sus propias herramientas para ejecutar un servicios para lo construído, debido que existen productos de código abierto, así como existen productos comerciales que ofrecen funcionalidades necesarias. Algunos de los populares incluyen Cruise- Control (http://cruisecontrol.sf.net), hormiguero (htpp:/www.urbancode.com), Continuum (htpp://maven.apache.apache.org/continuum) y Bambú (htpp://www.atlassian.com/software/bamboo/)., y otros que estan apareciendo en el tiempo.
Si usted está interesado en aprender más sobre integración contínua y sus herramientas asociadas, consulte el artículo de Martin Fowler "Continua Integración" o James Costa ha hecho una gran escritura de la diferencia entre hacer la integración contínua y el uso de servidores de integración continúa.
1.5.4 Código de coberturaMuchos desarrolladores están familiarizados con herramientas de análisis de código estático.Los desarrolladores en particular, podrían tener experiencia en ejecutar la herramienta PMD (http:/pmd.sf.net) para detectar anomalías en relación con el uso ilegal de determinadas construcciones o para calcular las mediciones de la complejidad. La mayor atención a las pruebas automatizadas y especialemnete , las pruebas unitarias , también se creado una serie de herramientas para medir la cobertura del código. en resúmen . la cobertura del código es una medida de cúanto findo ejercen nuestras pruebas automatizadas en el código de producción y sus declaraciones de código de fuente, ramas y expresiones.
El principal beneficio es la incorporación de medidas de cobertura de código basado enla constante prueba de nuestro software. Esto es especialmente útil cuando un equipo está empezando aescribir las pruebas unitarias o la adopción de TDD, porque ayuda a la búsqueda de ámbitos de la base de código.
¿Qué grado de cobertura debo apuntar?Cuando nos planteamos el tema de cobertura , nos cuestionamos a qué altura debemos poner el listón de cobertura, si es de un 100%, 90% o un 80%?.
La respuesta es depende , de las tecnologías específicas , idiomas, herramientas en uso y frecuencia. Para Java y proyectos J2ee es una cobertura promedio de 85%.