Mostrando entradas con la etiqueta plugin. Mostrar todas las entradas
Mostrando entradas con la etiqueta plugin. Mostrar todas las entradas

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 {}

martes, 18 de junio de 2019

Como crear un JAR con Maven con las dependencias incluidas

Intentando realizar un ´custom connnector´ de WSO2, me encontré con el problema de que tenia que crear un fichero .ZIP y que este incluyera todas las dependencias dentro. Si queremos crerar un Jar que tenga las dependencias incluidas podemos hacerlo de varias formas y aquí iremos explicando cada una. 
  • Con Maven Dependency Plugin
Con este plugin propiamente no vamos a incluir las librerias dentro del JAR, pero podremos exportar las dependencias a una carpeta e identificar facilmente todas las necesarias. Util cuando debemos incluirlas en un servidor, para el correcto funcionamiento de nuestro JAR. 

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <version>2.8</version>
  <executions>
    <execution>
      <id>copy-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <outputDirectory>${project.build.directory}/dependencies</outputDirectory>
        <includeScope>runtime</includeScope>
      </configuration>
    </execution>
  </executions>
</plugin>
  • Con Maven Assembly Plugin y descriptorRef
A través del plugin 'assembly' podremos realizar un empaquetado final con más información y contenido que simplemente las clases compiladas. La forma mas sencilla de realizarlo a traves de este plugin es:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
</plugin>
  • Con Maven Assembly Plugin y los descriptor files
Al final, lo que hemos visto antes, no es más que una pre configuración de un descriptor file que viene por defecto con el plugin. A través de un descriptor file, podremos indicar una configuración más personalizada del plugin y podremos generar el fichero comprimible que deseemos de la forma que deseemos. 

Para ello deberemos incluir la siguiente seccion dentro de nuestro descriptor file:

<dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  • Con Maven Shade Plugin
Con este plugin tendremos una solucion parecida a la del assembly. Con la ventaja que nos permitira shaded las clases. Es decir, en un jar con muchas dependencias puede darse la existencia de clases con nombres iguales. Mientras que el plugin Assembly las sobreescribia, el Shade Plugin realiza una recolocacion de las mismas, evitando problemas del tipo NoClassDefFoundError or NoSuchMethodException. En este caso, la configuracion seria la siguiente:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
    </execution>
  </executions>
</plugin>