05-01-2021

Bdd con behat en php: cómo crear pruebas

Hace bastante tiempo os hablé de las pruebas TDD y de las pruebas unitarias. Hoy os quiero hablar de las pruebas bdd, "behavior-driven development", en php usando behat.

¿Qué son las pruebas bdd?


Las pruebas bdd más que ser pruebas son una estrategia de desarrollo. Lo que plantea es definir un lenguaje común para el negocio y para los técnicos, y utilizar eso como parte inicial del desarrollo y el testing. Por esto es que es importante que vos como tester entiendas bien qué es BDD. Es decir, expresar en lenguaje natural lo que se quiere y trasladar a código lo que se ha especificado para evitar malos entendidos entre el product owner y la parte técnica. Y una de las maneras de conseguir eso es usando behat y gherkin.
Usando esta herramienta, behat, se especifica un documento llamado "loquesea.feature" con los requisitos a implementar. En un proyecto puede haber varios archivos ".feature" para agrupar los requisitos por funcionalidad o secciones, por ejemplo. Luego habrá otro fichero llamado "FeatureContext.php" donde estará la implementación del código que se requiere en el fichero ".feature" y despsués probar que todo está bien.
Una vez que se ha instalado behat, dentro de nuestro proyecto, lanzaremos el comando "./vendor/bin/behat --init" y veremos que se ha creado, dentro de nuestro proyecto, una carpeta llamada "features" y dentro dentro de esa carpeta otra llamada "bootstrap".
Dentro de la carpeta "features" se crearan los ficheros con extensión ".feature" para especificar los requisitos, que tendrán el siguiente formato:
  • Feature: Nombre de la funcionalidad que vamos a probar, el título de la prueba.
  • Scenario: por cada prueba que se ejecutara se especifica la funcionalidad a probar.
  • Given: Este sería el contexto del escenario de prueba o las precondiciones de los datos.
  • When: Se especifican el conjunto de las acciones que se van a ejecutar en el test.
  • Then: Aquí se especifica el resultado esperado del test y/o las validaciones que deseamos realizar.

Por ejemplo creemos el fichero "features/calculadora.feature"

Feature: calculator
Scenario: Create a calculator
Given that I want to add to numbers
When I introduce the numbers 1 and 3
Then the result must be 4
Si después de crear el fichero "features/calculadora.feature" ejecutamos el comando "./vendor/bin/behat" y elegimos la opción 1 nos dirá que nos falta el fichero "FeatureContext.php" y nos dirá los métodos que tendría que tener según lo escrito en el fichero ".feature" en nuestro caso "calculadora.feature". Vayamos a crear el fichero "features/bootstrap/FeatureContext.php":


use Behat\Behat\Context\Context;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;

/**
 * Defines application features from the specific context.
 */
class FeatureContext implements Context
{

public $num1 = 0;
public $num2 = 0;
public $res = 0;
/**
 * Initializes context.
 *
 * Every scenario gets its own context instance.
 * You can also pass arbitrary arguments to the
 * context constructor through behat.yml.
 */
public function __construct()
{

}
/**
 *  @Given that I want to add to numbers
 */
public function queQuieroSumarDosNumeros()
{
 $this->res = $this->num1 + $this->num2;
}

/**
 * @When  I introduce the numbers :arg1 and :arg2
 */
public function ingresoLosNumerosY($arg1, $arg2)
{
$this->num1 = $arg1;
$this->num2 = $arg2;
}

/**
 * @Then the result must be :arg1
 */
public function solicitoElResultadoDelCalculo($arg1)
{
$this->res = $this->num1 + $this->num2;
if ( $this->res != $arg1) {
  throw new Exception("Error in the addition");
}
}
}
Vemos que cada método de la clase tiene unas anotaciones y que salvo la clase constructor coindiden con lo escrito en el fichero feature. ¡OJO! el texto de cada anotación tiene que coincidir con lo escrito en cada especificación del fichero .feature sino al ejecutar behat nos dirá que falta código.
Cuando ejecutemos "./vendor/bin/behat". Si se cumplen las especificaciones del fichero .feature y si todo está bien.
El fichero ".feature" puede estar en español de la siguiente manera:

#language: es

Característica: Crear una calculadora

Escenario: Sumar dos números
Cuando ingreso los números 1 y 3
Y solicito el resultado del cálculo
Entonces el resultado debe ser 4