Todas los cambios en el documento vendrán acompañados de un registro de las modificaciones. De este modo se podrá realizar un seguimiento y consultar su evolución.
Con este artículo se pretende abordar la cuestión de la documentación a entregar en los proyectos gestionados bajo un marco de metodología ágil. Las historias de usuarios y las pruebas que la validan serán el pilar sobre el que sostener el conocimiento de las diferentes aplicaciones.
Actualmente la STIC dispone de un conjunto de herramientas destinadas a la gestión de los proyectos y del conocimiento generado como consecuencia del trabajo diario. JIRA y Confluence se utilizan habitualmente para este fin. Pero, tal y como se indica en el DoD estandar, el formato para los planes de pruebas de las historias de usuario funcionales serán archivos de extensión .feature que se subirán al repositorio de código Git, junto con el código a probar.
Esto nos permitirá trabajar en la generación de unos planes de prueba vivos, dinámicos, que se puedan organizar por funcionalidades, y que estén preparados para su automatización. La redacción de pruebas en este formato y la utilización de Gherkin como lenguaje para su redacción se extiende a todas las pruebas funcionales.
Cualquier otro medio o formato de entrega deberá ser previamente consensuado con la STIC y definido en el DoR y/o DoD del proyecto.
La herramienta destinada a la gestión del proyecto es JIRA. En ella se darán de alta los diferentes requisitos que seguirán la siguiente organización jerárquica:
El formato en el que se redactará seguirá la siguiente narrativa:
Como <rol: ¿Para quién vamos a construir esto?>
Quiero <acción: ¿Qué vamos a construir?>
Para <valor de negocio: ¿Por qué vamos a construirlo?>
Las historias incluirán sus criterios de aceptación en la propia historia de usuario de JIRA en lenguaje natural con formato Gherkin (tal y como se indica en el DoR y DoD), priorizando siempre la claridad y enfoque funcional al formato . Estos son fundamentales para validar que cumple con las necesidades de negocio, además de ayudar a los desarrolladores a entender el funcionamiento del producto y servir como guía durante la implementación de la funcionalidad.
En el caso de equipos con una madurez ágil baja o no familiarizados con los criterios de aceptación o con su correcta redacción y enfoque funcional, el uso de Gherkin ayuda y guía en la redacción paso a paso de los mismos, sin olvidar detalles fundamentales de la aplicación y descripción de las pruebas. El objetivo final es definir el funcionamiento de forma declarativa en base a ejemplos.
Plantilla de CAs en formato Gherkin:
Nº (de escenario) | Título (del CA) | Contexto | Evento | Resultado/Comportamiento |
---|---|---|---|---|
1 | Título | Dado... | Cuando... | Entonces... |
A modo ilustrativo, se añaden a continuación una serie de ejemplos sobre la definición de las historias de usuario con distintos niveles de complejidad utilizando para ello historias de usuario definidas en el ámbito del proyecto Estación Clínica Unificada (ECU):
Historia de usuario simple
Historia de usuario compleja
Para la formalización de los casos de pruebas y sus precondiciones, se usará lenguaje Gherkin. El proveedor los entregará en archivos de extensión .feature.
Los objetivos de esta entrega de feature son los siguientes:
Este formato de entrega nos permitirá, por un lado, el alta de las pruebas de forma masiva en JIRA y, por otro, disponer de la redacción correcta para una posible automatización utilizando Cucumber según se recoge en la "Normativa de automatización de pruebas".
Algo a tener en cuenta desde el punto de vista de la organización de las pruebas es que éstas se agruparán, siempre que sea posible, en áreas funcionales que llamaremos Subsistemas. Cada uno de ellos tendrá asociado un código.
En las metodologías ágiles, los features (característica) es una unidad funcional de un sistema software que satisface una necesidad de las partes interesadas, representa una decisión de diseño y genera una opción de implementación.
Un archivo .feature también es un punto de entrada a la automatización de pruebas usando la herramienta cucumber. Este es un archivo donde se describirán las pruebas en lenguaje descriptivo. Es una parte esencial de Cucumber, ya que sirve como script de prueba de automatización y como documentación viva.
Como hemos comentado antes, éste será el formato de entrega de las pruebas. En esta sección vamos a centrarnos en su estructura y definición. Posteriormente hablaremos de su redacción, indicando un conjunto de buenas prácticas que nos ayuden a su correcta implementación.
De cara a la importación a JIRA, los archivos .feature deberán cumplir con una serie de características:
Como normal general, comenzará por el id de la historia de usuario, añadiendo una breve descripción. Esto nos ayudará a ubicarnos de forma rápida y sencilla. El formato sería el siguiente: ID JIRA STIC_Breve Descripción.
Por ejemplo:
El o los archivos .feature relacionados con la historia de usuario SIGLOCON-106, comenzará por "SIGLOCON-106" seguido de una breve descripción (SIGLOCON-106_RecuentoDeFactura.feature).
Más información relacionada con la importación en el artículo: https://confluence.xpand-it.com/display/public/XRAY/Importing+Cucumber+Tests+-+REST
A continuación, partiendo del siguiente ejemplo, se va a ir explicando cada una de las secciones que componen el archivo, así como las etiquetas que aparecen en el mismo.
@REQ_PBT-342 Feature: Búsqueda en Google Como usuario web, quiero buscar en Google para poder responder mis dudas. Background: #@PBT-144 Given que que una instancia de un navegador Chrome está accesible y operativa @PROVEEDOR Scenario: SUB001 - Búsqueda simple en Google Given un navegador web en la página de Google When se introduce la palabra de búsqueda "pingüino" Then se muestra el resultado de "pingüino" @AUTO_INDRA Scenario Outline: SUB001 - Búsqueda simple en Google Given un navegador web en la página de Google When se introduce la palabra de búsqueda <frase> Then se muestra el resultado de <frase> And los resultados relacionados <relacionados> Examples: | frase | relacionados | | pingüino | Pingüino emperador | | panda | Panda gigante | | elefante | Elefante Africano |
Lo primero que aparece es @REQ_PBT-342: éste es el id de la historia de usuario del JIRA de la STIC, con la que se relacionan las pruebas, junto con el prefijo REQ_, que es necesario para que se genere la relación historia-prueba en el JIRA una vez se carguen los ficheros .feature a la plataforma. Al cargar las pruebas en JIRA se establecerá un enlace entre cada prueba y su correspondiente historia de usuario. Esto nos permitirá obtener el porcentaje de cobertura de los requisitos.
El propósito de esta palabra clave es proporcionar una descripción a alto nivel de una funcionalidad, y agrupar las pruebas relacionadas. Se recomienda que dicha descripción coincida con el título de la historia.
Además, justo debajo de "Feature" y antes de "Background" se describirá de modo coloquial qué se prueba. Esto mejora la compresión de los informes de resultados generados tanto para las pruebas automáticas como para las manuales, dando una visión más cercana a los lectores que no estén habituados a entender qué se ha probado.
Bajo este epígrafe se crearán las precondiciones comunes a todos los escenarios. La intención es evitar repeticiones innecesarias y focalizar la prueba específica bajo el epígrafe de los Scenarios.
Al cargar las pruebas en JIRA, se creará una precondición por cada "Given" que aparezca en el aparatado Background. Además, todos los escenarios del archivo, quedarán enlazados con sus precondiciones. Por otro lado, los escenarios se pueden enlazar también a precondiciones que ya estén dadas de alta en JIRA, con el objetivo de reutilizarlas evitando así su repetición . Para eso, en lugar de utilizar la palabra clave "Given", se usará la anotación #@id_precondicion, donde id_precondicion es el id del tique JIRA.
En nuestro ejemplo, las pruebas quedarán enlazadas a dos precondiciones: Una que se creará en el momento de la carga (ya que hay un único "Given"), y otra, a la precondición PBT-144. Es importante señalar que para enlazar a una precondición existente en JIRA, es necesario utilizar la anotación #@id_precondicion tal y como aparece en la imagen de arriba.
Bajo esta palabra clave, estarán definidas la diferentes pruebas asociadas a una HU. Al cargar el archivo en JIRA, se creará una prueba por cada escenario.
Los títulos de los escenarios vendrán precedidos de la expresión SUBXXX - título del criterio de aceptación que prueba, donde SUBXXX es el subsistema sobre el que se prueba (XXX es el código del subsistema). Si no existiese una división funcional, estos "códigos de subsistemas" no aparecerían, por lo que no se incluirá el SUBXXX, sólo el título de la prueba.
EJEMPLO: El título de un escenario del proyecto DYECCWEB quedaría como sigue: SUB002 - Pintar la sección de datos de paciente, donde '002' es el código del subsistema "Identificación usuario" y 'Pintar la sección de datos de paciente' es el título del criterio de aceptación.
Cada escenario llevará una serie de etiquetas que nos facilitarán su clasificación, y nos servirá para lanzar las pruebas por grupos, en el caso de que se automaticen. Las mínimas a utilizar son las que aparecen a continuación. En cualquier caso, si se estima oportuno, se pueden incluir otras, que previamente se hayan consensuado con la Oficina de Calidad.
Es posible la creación de una única prueba que se ejecutará para varios juegos de datos. En ese caso se utilizará el Scenario Outline que es un tipo de escenario donde se especifican datos de entrada. Son muy prácticos ya que gracias a esto no es necesario escribir un escenario por dato de entrada. Este tipo de escenarios tienen que llevar incluidos los datos en el formato que aparece en el ejemplo facilitado. En lo relacionado con el uso de las etiquetas, se seguirán las pautas indicadas anteriormente.
A continuación se añaden algunos ejemplos dando continuidad a los utilizados en el apartado anterior.
US Simple: Acceso a PIT. Aunque esta historia es sencilla se podría dividir en dos .features.
US Compleja : Crear apartado de datos de identificación de usuario. Esta historia se podría dividir en los siguientes .features dada la complejidad de la misma:
A continuación se indican una serie de buenas prácticas en Gherkin a tener en cuenta a la hora de escribir este tipo de escenarios. Están acompañadas de ejemplos para facilitar su comprensión:
# | Buena práctica |
---|---|
1 | Escribe Gherkin para que las personas que no conocen la funcionalidad, la entiendan. |
2 | Un escenario, un comportamiento. Un escenario no puede estar representado por diversas acciones y resultados. Patrón incorrecto Given... When... Then... When... Then... Patrón correcto Given... When... Then... |
3 | Trata de evitar, en la medida de lo posible, referencias a los detalles de la interfaz de usuario. De esta forma, si la interfaz cambia, la prueba puede continuar siendo válida. Redacción incorrecta Given que se introduce un número entero And posteriormente se introduce otro When se pulsa el botón "SUMA" Then aparece el resultado en el recuadro de la esquina inferior izquierda Redacción correcta Given que se introduce un número entero And posteriormente se introduce otro When se calcula el resultado Then se comprueba que es correcto |
4 | Utiliza el "Scenario Outline" para cubrir distintas variaciones del mismo comportamiento. Ejemplo incorrecto Para probar la suma de dos números enteros, se diseñan tres pruebas. Una para sumar dos números enteros positivos, otra para sumar dos números enteros negativos y otra para sumar un número entero positivo, y un número entero negativo. suma.feature Scenario: Como usuario, quiero calcular la suma de dos números positivos Given Se ha introducido "3" en la calculadora And se ha introducido "1" en la calculadora when se calcula el resultado Then el número "4" aparece en la pantalla Scenario: Como usuario, quiero calcular la suma de dos números negativos Given Se ha introducido "-3" en la calculadora And se ha introducido "-1" en la calculadora when se calcula el resultado Then el número "-4" aparece en la pantalla Scenario: Como usuario, quiero calcular la suma de un número negativo y un número positivo Given Se ha introducido "-3" en la calculadora And se ha introducido "1" en la calculadora when se calcula el resultado Then el número "-2" aparece en la pantalla Ejemplo correcto Para probar la suma de dos números enteros, se diseña una única prueba. Se introducen como ejemplos la suma de dos números enteros positivos, la suma de dos números enteros negativos y la suma de un número entero positivo, y uno negativo. suma.feature Scenario Outline: Como usuario, quiero calcular la suma de dos números enteros Given Se ha introducido <input_1> en la calculadora And se ha introducido <input_2> en la calculadora when se calcula el resultado Then el número <output> aparece en la pantalla Examples: |input_1 |input_2 |output | |1 |3 |4 | |-1 |-3 |-4 | |-1 |3 |2 | |1 |-3 |2 | |
5 | Redacción declarativa, no imperativa. Se redactará la prueba tratando que declarar cuál es el comportamiento esperado y no dando pautas o pasos a realizar para la prueba. Ejemplo incorrecto Given que un usuario se autentica con una tarjeta habilitada Ejemplo correcto Given que un usuario se autentica con una tarjeta habilitada |
6 | Hay que prestar especial atención a los datos que aparecen "quemados" en las pruebas. Es necesario garantizar que esos datos estarán siempre disponibles ya que, de no ser así, la prueba podría ofrecer un falso negativo La manera de hacerlo se consensuará con la STIC. |
7 | Si quieres añadir comentarios que puedan ser interesantes durante la ejecución de pruebas utiliza "#" y a continuación, incorpora el comentario. Feature: Búsqueda en Google # Autor:verificacion@oca.com |
8 | Incorpora siempre un título al Background del feature, ya que si no lo haces, cuando se importe el archivo a JIRA, la precondición se mostrará sin título y será complicado localizarla |
9 | Es conveniente que reutilices las precondiciones que ya están dadas de alta en JIRA. Para ello, basta con que indiques el id de la precondición ya creada con anterioridad acompañada de "@". Por ejemplo, en el caso de que ya contemos con la precondición "PBT-144" y vayamos a reutilizarla pondríamos: @REQ_PBT-342 Feature: Búsqueda en Google Como usuario web, quiero buscar en Google para poder responder mis dudas. Background: #@PBT-144 Given que que una instancia de un navegador Chrome está accesible y operativa |
12 | Incluye etiquetas identificativas a cada scenario, esto nos ayudará a realizar filtros a posteriori que nos ayude a localizar los test. |
13 | Recuerda esta máxima:
|
14 | No escribas el mismo texto en las sentencias Given / When /Then, ya que si se automatizara la prueba, cucumber puede entender que son pasos duplicados Por ejemplo, una definición incorrecta sería: Given there is money in my account Then there is money in my account |
15 | Puedes usar "But" cuando quieras verificar que no se observa un resultado concreto (funciona igual que el Then), por ejemplo: Given Cumplo una precondición When Ejecuto una acciónThen Observo este resultado But No debería poder observar este otro resultado |
A continuación, se listan las características de la entrega de los archivos .feature.