Introducción a las pruebas automatizadas con Codeception en proyectos PHP

¿Qué es el testing automatizado? ¿Cómo lo estamos implementando en WATA Factory? ¿Cuáles son los motivos que hacen al testing automatizado tan interesante?

En este artículo hablaremos sobre Codeception, una de las herramientas que utilizamos para la automatización de pruebas para nuestros proyectos web implementados en PHP.

¿Qué es el testing automatizado?

En el ámbito de las pruebas de software, cuando hablamos de testing automatizado, nos referimos a conseguir que las pruebas que se realizan de forma manual puedan ser ejecutadas de forma desatendida, por medio de alguna herramienta que realice el proceso automáticamente, y como ya mencionamos en un articulo anterior, hacer que se mejore el proceso pero sin suplir al 100% el beneficio del testing manual.

Si podemos hacer que los tests sean ejecutados por un ordenador, entonces conseguiremos ejecutarlos de forma continuada según vayamos desarrollando la aplicación.

¿Por qué el testing automático es interesante para nosotros?

En WATA Factory nos vimos en la necesidad de implementar este tipo de pruebas ya que la evolución de nuestros proyectos requería de nuevas funcionalidades, que debían ser probadas en conjunto con las ya existentes para continuar asegurando la calidad de nuestros productos.

La automatización de pruebas trae una serie de beneficios que ayudan a elevar el nivel de calidad del producto y también a disminuir su coste, ya que la repetición de pruebas no supone una inversion grande de tiempo en las fases de mejora o evolución del producto.

Algunas de las ventajas que hemos conseguido en WATA Factory con la implementación de las pruebas automatizadas son:

  • Verificar de forma automática que las especificaciones que se han definido se cumplen, haciendo uso de BDD (Behavior Driven Development). Uno de sus grandes beneficios es que nos permite mantener un lenguaje común entre el cliente y el equipo de desarrollo, detallando casos que verifican que el comportamiento del código es correcto desde el punto de vista del usuario.
  • Reducir el número de bugs, ya que aseguramos que tanto la nueva funcionalidad como la antigua continúan trabajando correctamente.
  • Ganar tiempo probando, ya que evitamos las tareas repetitivas, y aseguramos que los nuevos cambios en nuestra aplicación no afectan en otras partes del sistema.
  • Crear una buena documentación.
  • Y hacer que el trabajo en equipo sea más sencillo y seguro.

Para comenzar con el desarrollo de las pruebas automatizadas estuvimos investigando sobre frameworks de pruebas y descubrimos Codeception, que reunía todo lo que necesitábamos en una sola herramienta.

¿Qué es Codeception y cómo podemos instalarlo?

Codeception es un framework de pruebas para PHP cuyo objetivo es crear tests legibles que describan acciones desde la perspectiva del usuario. Nos permite hacer pruebas de aceptación, funcionales y unitarias.

La clave de Codeception son sus actores. Codeception entiende los tests como acciones que ejecuta una persona. Como resumen, un UnitTester ejecuta acciones y testea código, un FunctionalTester prueba la aplicación en su conjunto, y un AcceptanceTester interactúa con la interfaz.

Cada Actor ejecuta Steps, que son instrucciones individuales dentro de un escenario. Las instrucciones que puede generar un Actor se agrupan en módulos: PhpBrowser, WebDriver, DB, FileSystem, etc.

Para su instalación seguimos los pasos descritos en la documentación oficial.

Con la instalación se crea una carpeta llamada tests, y dentro de esta carpeta se crea una estructura básica para codificar los diferentes tipos de pruebas.

Como ejemplo vamos a testear el clásico Login. Aunque son mas los escenarios que detallar en esta prueba solo mostramos alguno de ellos para no extenderlo.

Para crear el test se ejecuta el comando:

php vendor/bin/codecept g:feature acceptance Login

Esto creará una fichero ‘.feature’ en el que escribiremos nuestra historia de usuario en un lenguaje formal llamado Gherkin con la particularidad de que podemos ejecutar estos escenarios como pruebas automatizadas.

Feature: Login page
Check that the user can access correctly with correct credentials, in other case a warning text is shown.
 
Scenario: User inserts empty password and empty username
   Given I am on login page
   When I fill fields with empty value
     And I click on login button
   Then I see the entered user data are not correct
 
Scenario: Successful access with valid credencials
   Given I am on login page
   When I fill the fields with correct credencials
     And I click on login button
   Then I see Welcome Dummy Name

Los escenarios se escriben paso a paso usando «Given-When-Then».

  • La parte GIVEN son las condiciones previas para la pruebas. Desde donde partimos.
  • La sección WHEN es ese comportamiento que estás especificando, es decir las acciones que necesitamos.
  • Y finalmente THEN que es la parte donde obtenemos el resultado esperado.

Definiendo las pruebas

Nuestro próximo paso será definir y transformar el archivo de características en una prueba válida. Los definiremos en el archivo del AcceptanceTester.

Para conseguir los pasos necesarios se ejecuta el siguiente comando:

php vendor/bin/codecept gherkin:snippets acceptance

Para implementarlos como estamos en la suite de aceptación usamos WebDriver como modulo, ya que nos permite la interacción con el navegador. Esto significa que podemos utilizar sus métodos dentro del archivo Tester, como hacemos con las pruebas de escritura usando

$I->

Se puede emplear diferentes métodos que ya están desarrollados (por ejemplo amOnPage o click). Cada paso del escenario Gherkin se extenderá con los métodos definidos en Codeception.

Vamos a mostrar cómo puede ser implementado en nuestro caso:

/**
 * @Given I am on login page
 */
public function iAmOnLoginPage()
{
    $I->amOnPage('/login');
}

/**
 * @When I fill fields with empty value
 */
public function iFillFieldsWithEmptyValue()
{
    $I->fillField('#username','');
    $I->fillField('#password','');
}

/**
 * @When I fill the fields with correct credencials
 */
public function iFillTheFieldsWithCorrectCredencials()
{
    $I->fillField('#username','correctUsername');
    $I->fillField('#password','correctPassword');
}

/**
 * @When I click on login button
 */
public function iClickOnLoginButton()
{
    $I->click('Login');
}

/**
 * @Then I see the entered user data are not correct
 */
public function iSeeTheEnteredUserDataAreNotCorrect()
{
    $I->see('the entered user data are not correct');
}

/**
 * @Then I see Welcome Dummy Name
 */
public function iSeeWelcomeDummyName()
{
    $I->see('Welcome Dummy Name,');
}

Finalmente ejecutamos nuestro archivo .feature con el comando

php vendor/bin/codecept run acceptance Login.feature --steps 

para ver que Given/When/Then se amplían con subpasos y muestra el resultado esperado sobre la ejecucion.

Acceptance Tests (2)
-------------------------------------------------------------
Login page: User inserts empty password and empty username Signature: User inserts empty password and empty username
Test: App/Tests/surveys/Login.feature:User inserts empty password and empty username

Scenario -- 
Check that the user can access correctly with correct credentials, in other case a warning text is shown.

Given i am on login page
   I am on url "https://###########/login"
When i fill fields with empty value
   I fill field "#username"," "
   I fill field "#password"," "
And i click on login button 
   I click "LOGIN"
   I wait 5
Then i see the entered user data are not correct 
   I see "the entered user data are not correct" 
PASSED 

Login page: User inserts proper information - Successful access with valid credencials 
Signature: Successful access with valid credencials 
Test: App/Tests/surveys/articulo_test.feature: Successful access with valid credencials

Scenario --
Check that the user can access correctly with correct credentials, in other case a warning text is shown.

Given i am on login page 
   I am on url "https://########/login"
When i fill the fields with correct credencials 
   I fill field "#username","correctUsername"
   I fill field "#password","correctPassword"
And i click on login button 
   I click "LOGIN"
   I wait 5
Then i see welcome dummy name 
   I see "Welcome Dummy Name,"
PASSED 
-------------------------------------------------------------
Time: 19.57 seconds, Memory: 18.00 MB OK (2 tests, 2 assertions)

Son muchas las ventajas que nos ofrece esta herramienta, además también cuenta con una aplicación, conocida como Webception, en la que el cliente puede ejecutar todos los test desde el navegador y así poder seguir el estado de su aplicación.