BDD (programación)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 20 de abril de 2020; las comprobaciones requieren 4 ediciones .

BDD (abreviado del inglés  Behavior-driven development , literalmente " desarrollo a través del comportamiento ") es una metodología de desarrollo de software que es una rama de la metodología de desarrollo basado en pruebas (TDD).

La idea principal de esta metodología es la combinación de intereses puramente técnicos e intereses comerciales en el proceso de desarrollo, lo que permite que el personal de administración y los programadores hablen el mismo idioma. Para la comunicación entre estos grupos de personal, se utiliza un lenguaje específico de dominio , que se basa en construcciones de lenguaje natural que son comprensibles para un no especialista, generalmente expresando el comportamiento de un producto de software y los resultados esperados.

Se cree que este enfoque es efectivo cuando el área temática en la que opera el producto de software se describe de una manera muy compleja.

Descripción

La metodología BDD es una extensión de TDD en el sentido de que antes de escribir cualquier prueba, primero debe describir el resultado deseado de la funcionalidad agregada en un lenguaje específico del dominio. Una vez hecho esto, las construcciones de este lenguaje son traducidas por especialistas o software especial en una descripción de prueba.

BDD se centra en las siguientes preguntas:

Con base en estas preguntas, BDD requiere que los nombres de prueba sean oraciones completas que comiencen con un verbo en subjuntivo y sigan los objetivos comerciales. Las descripciones de las pruebas de aceptación deben escribirse en un lenguaje de historia de usuario flexible, p.

Como [papel de alguien cuyos intereses comerciales se sirven] quiero [describir la funcionalidad de la forma en que debería funcionar] para [describir el beneficio].

Los criterios de aceptación deben describirse en términos de un escenario que el usuario implementa para lograr el resultado.

Principios de BDD

Como ya se señaló, las pruebas para una pieza de software deben describirse en términos del comportamiento deseado del dispositivo programable. El comportamiento deseado aquí se refiere a uno que es de valor para el negocio. La descripción del comportamiento deseado se da con la ayuda de una especificación de comportamiento . 

La especificación de comportamiento se construye de forma semiformal. Actualmente, se ha establecido la siguiente estructura en la práctica de BDD:

  1. Título ( ing.  Título ). En forma subjuntiva, se debe dar una descripción del objeto social.
  2. Descripción ( narrativa inglesa  ). En forma breve y libre, se deben divulgar las siguientes preguntas:
    1. Quién es el actor de esta historia;
    2. ¿Qué se incluye en esta historia?
    3. ¿Qué valor proporciona esta historia para el negocio?
  3. Escenarios ( ing.  Escenarios ). Puede haber uno o más escenarios en una especificación, cada uno de los cuales revela una de las situaciones de comportamiento del usuario, concretando así la descripción de la especificación. Cada escenario se suele construir de acuerdo con el mismo patrón:
    1. Condiciones iniciales (una o más);
    2. El evento que desencadena el inicio de este script;
    3. Resultado o resultados esperados.

BDD no proporciona ninguna regla formal, pero insiste en que se use un conjunto estándar limitado de frases que incluiría todos los elementos de una especificación de comportamiento. En 2007, Dan North propuso una plantilla de especificación que ganó popularidad y se conoció como el lenguaje Gherkin [1] [2] .

Las frases básicas del idioma Gherkin se presentan en la siguiente tabla.

lengua pepinillo
palabra clave en ingles adaptación al idioma ruso Descripción
Historia
( Característica [3] )
Historia Cada nueva especificación comienza con esta palabra clave seguida de dos puntos en la forma subjuntiva del nombre de la historia.
Como un Cómo (en un papel) El rol de la persona en el modelo de negocio que está interesada en esta funcionalidad.
Con el fin de Para alcanzar Brevemente, cuáles son los objetivos de la persona.
Yo quiero Yo quiero Describe brevemente el resultado final.
Guión Guión Cada escenario de una historia comienza con esta palabra, después de lo cual el objetivo del escenario se escribe en forma de subjuntivo, separado por dos puntos. Si hay varios escenarios en una historia, luego de la palabra clave se debe escribir su número ordinal.
Dado Dado Condición inicial. Si hay varias condiciones iniciales, cada nueva condición se agrega desde una nueva línea usando la palabra clave Y.
Cuando Cuando ( nota : algo sucede) El evento que desencadena este script. Si el evento no se puede revelar en una oración, todos los detalles subsiguientes se revelan a través de las palabras clave Y y Pero.
Después Después El resultado que el usuario eventualmente debería observar. Si el resultado no se puede revelar en una oración, todos los detalles subsiguientes se revelan a través de las palabras clave Y y Pero.
Y Y Palabra clave auxiliar, análogo de conjunción .
Pero Pero Palabra clave auxiliar, análogo de la negación .

El siguiente ejemplo demuestra una especificación de comportamiento usando el lenguaje Gherkin.

Historia: Las devoluciones van a stock Como propietario de una tienda Para realizar un seguimiento de las existencias , quiero volver a agregar artículos a las existencias cuando se devuelvan. Escenario 1 : los artículos reembolsados ​​deben devolverse al inventario dado que un cliente me compró previamente un suéter negro y tengo tres suéteres negros en stock. Cuando devuelvan el suéter negro para un reembolso Entonces debería tener cuatro suéteres negros en stock. Escenario 2 : los artículos reemplazados deben devolverse al stock dado que un cliente me compró previamente una prenda azul y tengo dos prendas azules en stock y tres prendas negras en stock. Cuando devuelvan la prenda azul por una negra , entonces debería tener tres prendas azules en stock y dos prendas negras en stock. Historial: El artículo devuelto debe mantenerse en stock Como propietario de una tienda Para realizar un seguimiento del inventario en el almacén , quiero restaurar los registros de los artículos que se devuelven al almacén. Escenario 1 : Los artículos devueltos deben colocarse en stock dado que un cliente me compró previamente un suéter negro Y ya tengo tres idénticos en stock. Cuando el cliente devuelve el suéter comprado , debería ver que ahora hay 4 suéteres negros en stock. Escenario 2 : Los artículos reemplazados deben devolverse al almacén dado que un cliente me compró una prenda azul Y tengo dos de estos artículos en azul Y tres artículos negros en mi almacén. Cuando un cliente devuelve una prenda azul para ser reemplazada por una similar pero negra Entonces debería ver que ahora hay tres artículos en stock para la prenda azul Y dos artículos para la prenda negra.

Maneras de implementar el concepto BDD

El formato de especificación de comportamiento semiformal requiere el uso de un conjunto limitado de propuestas que el personal de administración y los desarrolladores deben acordar de antemano. En base a esto, los marcos para soportar BDD se construyen de acuerdo con los siguientes principios:

Los marcos como JBehave y RBehave, que se basan en el lenguaje Gherkin, se basan en este principio. Algunos marcos se construyen de manera similar, como CBehave y Cucumber.

Ejemplo de implementación utilizando JBehave

Supongamos que estamos desarrollando un motor para el juego "Life" y necesitamos agregar la capacidad de colocar inicialmente células vivas en el campo. Supongamos que cuando el usuario selecciona algún punto libre del campo, aparece una celda viva sobre él. Si el usuario selecciona un punto de campo ya ocupado por una celda, la celda desaparece y el punto de campo queda libre. Las coordenadas del campo se ingresan en el formato (x,y), donde x es el número de punto horizontal e y es el número de punto vertical. El punto de referencia para ambas coordenadas comienza en la esquina superior izquierda, desde uno.

Omitiendo la descripción de la especificación de comportamiento por simplicidad, podemos escribir un script de este tipo en Gherkin.

Dado un juego de 5 por 5 Cuando alterno la celda en ( 3 , 4 ) Entonces la cuadrícula debería verse como ..... ..... ..... ..X .. ..... Cuando alternar la celda en ( 3 , 5 ) Entonces la cuadrícula debería verse como ..... ..... ..... ..X.. ..X.. Cuando alterne la celda en ( 3 , 4 ) Entonces la cuadrícula debería verse como ..... ..... ..... ..... ..X..

El marco JBehave está escrito en Java, por lo que las pruebas se traducen a código Java. Para el marco JBehave, este script se pasa como un archivo de texto sin formato, que se lee línea por línea. Todo lo que necesita un desarrollador es proporcionar funciones que JBehave debería llamar cuando salta a la siguiente línea. Por ejemplo, una implementación de prueba podría verse así:

juego de juego privado ; StringRenderer privado ; _ @Given ( "un juego de $ancho por $alto" ) public void theGameIsRunning ( int ancho , int alto ) { juego = nuevo Juego ( ancho , alto ); renderizador = new StringRenderer (); juego _ setObserver ( procesador ); } @When ( "Alterno la celda en ($columna, $fila)" ) public void iToggleTheCellAt ( int columna , int fila ) { juego . toggleCellAt ( columna , fila ); } @Then ( "la cuadrícula debería parecerse a $grid" ) public void theGridShouldLookLike ( String grid ) { assertThat ( renderer . asString (), equalTo ( grid )); }

Para asignar sin ambigüedades una función a una propuesta de Gherkin, se utilizan anotaciones de Java, que son proporcionadas por el marco JBehave. Por ejemplo, cuando el analizador del motor llega a cualquiera de las oraciones como

Cuando alterno la celda en (n, n)

el motor JBehave calculará a partir de la anotación que se debe llamar al método

void iToggleTheCellAt ( columna int , fila int )

además, la anotación está escrita de tal manera que el motor "entiende" que algunas partes de la oración deben capturarse y pasarse a la función como entrada (en este ejemplo, estas son las coordenadas del punto de campo). A continuación, la función llama a las funciones del propio juego "Life", y el desarrollador comprueba el comportamiento del motor del juego utilizando las herramientas habituales de TDD.

Ejemplos de marcos BDD

C/C++
  • Captura
  • Comportarse
rubí
  • comportarse
  • respec
Pitón
  • comportarse [4]
  • lechuga [5]
  • [ 6]
  • Marco de trabajo de robots [7]
.RED
  • comportarse
  • MSpec/Máquina.Especificaciones
  • Flujo de especificaciones
  • Pepinillos
  • Concordion.NET
  • fspec
  • naturalspec
  • marca de verificación
  • subespecificación
Java
  • comportarse
  • jnario
  • JGiven
  • Marco Vividus
JavaScript / mecanografiado
  • Jazmín
Lúa
  • Arrestado
Perl
  • Prueba::BDD::Pepino [8]
  • Prueba::Pepino::Pequeño [9]
  • Prueba::Cukes [10]
  • Prueba::Pcuke [11]
PHP
  • Behat
  • Codecepción
Vamos
  • Gingko
1C
  • Desarrollo impulsado por la automatización de Vanessa
multiplataforma
  • Pepino
  • chapotear
  • Yulup

Literatura

  • Carlos Solís , Xiaofeng Wang. Descripción general del concepto BDD  (inglés)  = Un estudio de las características del desarrollo impulsado por el comportamiento // IEEE 2011 37ª Conferencia EUROMICRO sobre ingeniería de software y aplicaciones avanzadas: una colección. - Oulu, Finlandia, 2011. - 3 de noviembre. - pág. 383-387 . — ISBN 978-1-4577-1027-8 . — ISSN 1089-6503 . -doi : 10.1109/ SEAA.2011.76.

Notas

  1. Norte .
  2. Estrictamente hablando, Gherkin es un lenguaje de especificación de comportamiento para el marco BDD de Cucumber, pero debido a la popularidad de este marco, cualquier cosa similar a esta especificación se llama Gherkin.
  3. Pepino. Referencia de pepinillo .
  4. Comportarse documentación . MetaCPAN (26 de febrero de 2019). Consultado el 26 de febrero de 2019. Archivado desde el original el 26 de febrero de 2019.
  5. Marco bdd de Lettuce python . MetaCPAN (26 de febrero de 2019). Consultado el 26 de febrero de 2019. Archivado desde el original el 1 de noviembre de 2020.
  6. Estructura de rábano - estructura de python bdd . MetaCPAN (26 de febrero de 2019). Consultado el 26 de febrero de 2019. Archivado desde el original el 26 de febrero de 2019.
  7. ↑ Estructura de robot: estructura bdd de python . MetaCPAN (26 de febrero de 2019). Consultado el 26 de febrero de 2019. Archivado desde el original el 27 de febrero de 2019.
  8. Test::BDD::Cucumber - Pruebas completas al estilo Cucumber en Perl . MetaCPAN (21 de abril de 2018). Consultado el 1 de noviembre de 2018. Archivado desde el original el 1 de noviembre de 2018.
  9. Test::Cucumber::Tiny - Pruebas estilo Cucumber en perl . MetaCPAN (14 de febrero de 2014). Consultado el 1 de noviembre de 2018. Archivado desde el original el 1 de noviembre de 2018.
  10. Test::Cukes - Una herramienta de prueba BBD inspirada en Cucumber . MetaCPAN (12 de diciembre de 2010). Consultado el 1 de noviembre de 2018. Archivado desde el original el 1 de noviembre de 2018.
  11. Test::Pcuke::Manual - es un prototipo de manual para el paquete Test::Pcuke . MetaCPAN (3 de diciembre de 2011). Consultado el 1 de noviembre de 2018. Archivado desde el original el 1 de noviembre de 2018.

Enlaces

  • Bellware, Scott. Desarrollo  impulsado por el comportamiento . www.codemag.com_ _ Fecha de acceso: 24 de septiembre de 2018.
  • Tharayil, Ranjith. Desarrollo impulsado por el comportamiento : simplificando el espacio del problema complejo  . www.solutionsiq.com (4 de abril de 2018). Fecha de acceso: 24 de septiembre de 2018.
  • Norte, Dan. Presentamos RBehave  . dannorth.net (17 de junio de 2007). Fecha de acceso: 24 de septiembre de 2018.
  • Gherkin Reference  (inglés)  (enlace no disponible) . docs.pepino.io _ Consultado el 25 de septiembre de 2018. Archivado desde el original el 9 de febrero de 2019.