sábado, 21 de septiembre de 2019

Cucumber: Como hacer un custom formatter


Hoy vamos a ver como hacer un custom formatter con Cucumber. De base Cucumber, trae distintos formatters, basicamente para crear distintos tipos de informes o modificar la salida de distintas formas. 

Hay que tener en cuenta una cosa, que aunque dentro del ecosistema Cucumber se les llame formatter, en realidad el código se basa en la creación de eventos y listener asociados. Dependiendo de la lógica a realizar, eligiremos un tipo de evento u otro. Este es el listado de eventos existentes:
  • TestCaseFinished: Se desencadena al comienzo de cada test case.
  • TestCaseStarted: Se desencadena al final de cada test case.
  • TestRunFinished: Se desencadena al final de las pruebas.
  • TestRunStarted: Se desencadena al comienzo de las pruebas.
  • TestStepFinished: Se desencadena al final de cada step.
  • TestStepStarted: Se desencadena al comienzo de cada step. 
Aparte del evento necesitaremos asociarlo a un listener. Antes de la existencia de las clases anonimas tendriamos que haber creado 2 clases. Ahora podremos hacerlo todo en una única clase. 

public class CucumberListener implements EventListener {
    @Override
    public void setEventPublisher(final EventPublisher publisher) {
        publisher.registerHandlerFor(TestRunFinished.class, handleRunFinished);

    }
    private EventHandler<TestRunFinished> handleRunFinished = new EventHandler<TestRunFinished>() {
        @Override
        public void receive(final TestRunFinished event) {
            //TODO make some logic
        }
    };
}

Por un lado instanciaremos una clase del tipo EventListener, a través de la cual registraremos el evento deseado. Y por otro lado crearemos una instancia de dicho evento, en la cual realizaremos la lógica deseada.

En función del tipo de evento podremos obtener unos valores u otros como el tiempo, pero poco más. Si queremos pasar otros valores deberemos hacerlo a través del constructor del listener y la declaración del mismo. Por ejemplo si queremos pasar un valor asociado a una variable String, deberiamos crear un constructor que recibiese dicho valor.

public class CucumberListener implements EventListener {
    private String inputParameter;
    public CucumberListener(final String inputParameter) {
        this. inputParameter = inputParameter;
    }
   //...
}

Ya solo nos quedaría indicarle a Cucumber que utilice nuestro plugin/formatter, por ejemplo a través de la tipica clase 'RunCukeTest'.

@RunWith(Cucumber.class)
@CucumberOptions( plugin = { "com.jakartaEEyYo.example.CucumberListener:inputParameter" })
public class RunCukeTest {}

No hay comentarios:

Publicar un comentario