Archivo de la categoría: DEBUN_Testing

Anidar listas de objetos de negocio en un modelo Json mediante Swagger

Enlaces utilizados

https://editor.swagger.io/ Editor online de Swagger
http://docs.swagger.io/spec.html Swagger RESTful API Documentation Specification
https://jsonformatter.org/ Formateador online para ficheros Json
https://roger13.github.io/SwagDefGen/ Generador de definición de objetos Json

 

Implementación

Para poder anidar distintos objetos de negocio dentro del Swagger, el primer paso consiste en añadir éstos en la sección definitions del Swagger.

Aquí deben declararse todos los que se van a utilizar para crear la lista de objetos de tipo Element según el ejemplo que se ha desarrollado.

Una vez añadidas las definiciones se añade al Swagger el siguiente código:

ElementList:  
    type: array
    description: Elements List.
    items:
      $ref: '#/definitions/Element'

         
Type indica a Swagger que el elemento contenido es de tipo array.
Description describe la lista de elementos de la lista.
items:
    $ref: '#/definitions/Element'
      
Con esta sintaxis se indica a Swagger que cada elemento de la lista ElementList se corresponde con una definición de objeto de negocio cuya definición també aparecerá cuándo Swagger muestre el modelo general.

Se pueden anidar varios niveles en la creación de un objeto complejo.   En el caso de ejemplo que se describe en el apartado  siguiente se puede visualizar tres niveles: ElementList -> Element  que contiene a su vez  listas del tipo Acces e Invoice.

Ejemplo

Código de ejemplo:

swagger: '2.0'
paths:
  '/MainEndpoint/{element}':
    get:
      summary: Getting information of the service.
      description: >-
        Description of the swagger service.
      parameters:
        - name: element
          in: path
          required: true
          type: string
          description: Element Id separated by commas.
      responses:
        '200':
          description: Specific element.
          schema:
            properties:
              sources:
                type: array
                items:
                  $ref: '#/definitions/ElementList'
        default:
          description: Unexpected error
          schema:
            $ref: '#/definitions/Error'
      x-auth-type: None
      x-throttling-tier: Unlimited
  /MainEndpoint:
    get:
      summary: Get the whole elements.
      description: |
        Get all the elements available.
      responses:
        '200':
          description: All the elements
          schema:
            properties:
              sources:
                title: ElementList
                type: array
                items:
                  $ref: '#/definitions/ElementList'
        default:
          description: Unexpected error
          schema:
            $ref: '#/definitions/Error'          
      x-auth-type: None
      x-throttling-tier: Unlimited
definitions:
  Error:
    type: object
    properties:
      code:
        type: integer
        format: int32
      message:
        type: string
      fields:
        type: string  
  ElementList:  
    type: array
    description: Elements List.
    items:
      $ref: '#/definitions/Element'
  Element:
    type: object
    description: Element.
    properties: 
      elementCode:
        type: string
        example: 5000
      name: 
        type: string 
        example: Door
      address: 
        type: string 
        example: Jumper Street number 65
      elementaccess: 
        type: array
        description: Acces element.
        items:
          $ref: '#/definitions/Access'
      maxwidth: 
        type: integer
        format: int32
        example: 250
      maxheight: 
        type: integer
        format: int32
        example: 100
      saved: 
        type: boolean 
        example: 1
      informationpoint: 
        type: boolean      
        example: 0
      open: 
        type: string  
        example: 1
      close: 
        type: string 
        example: 1
      exterior: 
        type: boolean
        example: 0
      elevator: 
        type: boolean 
        example: 1
      elementinvoicelist: 
        type: array
        description: Element invoice.
        items:
          $ref: '#/definitions/Invoice'       
      argumentelement: 
        type: integer
        format: int32
        example: 30
  Invoice: 
      type: object
      properties: 
        invoicetype: 
          type: string
          example: Custom
        descinvoicetype: 
          type: string
          example: 7 days
        elementtype: 
          type: string
          example: ElementType
        amount: 
          type: number
          format: float
          example: 50,35
        minutes: 
          type: integer
          format: int32
          example: 15
  Access: 
      type: object
      properties: 
        accessid: 
          type: string
          example: 45
        accessaddress: 
          type: string
          example: Boeing Street number 126.
info:
  title: Endpoint Title
  version: v1
  description: >-
    Description related with the endpoint
	
securityDefinitions:
  default:
    type: oauth2
    authorizationUrl: 'https://127.0.0.1:8080/authorize'
    flow: implicit
    scopes: {}
basePath: /Base/PathService/Element/v1
host: '127.0.01:8080'
schemes:
  - https
  - http    

 

 

Error al generar la documentación mediante Swagger

Situación:

Error principal

Al generar el código HTML de Swagger se produce un error en el proceso de compilación.

Traza del error:
Discovered module jersey
Discovered module obj-c
Discovered module php
Discovered module ruby
Discovered module xml
Discovered module swagger
Loading config /XXXXXXXXXXXXXXXXXX/_ACTIVE_PROJECTS/XXXXXXX/XXXXXXXXXXXX_GIT/B2B/B2BProj/ATG/ATG10.1.2/dgl_b2b/enunciate-b2b-configuration.xml
[enunciate] warning: The apt tool and its associated API are planned to be
[enunciate] removed in the next major JDK release. These features have been
[enunciate] superseded by javac and the standardized annotation processing API,
[enunciate] javax.annotation.processing and javax.lang.model. Users are
[enunciate] recommended to migrate to the annotation processing features of
[enunciate] javac; see the javac man page for more information.
BUILD FAILED
/XXXXXXXXXXXXXXX/_ACTIVE_PROJECTS/XXXXXXXXX/XXXXXXXXXX_GIT/XXX/XXXProj/ATG/ATGX.X.X/dgl_XXX/build.xml:582: org.codehaus.enunciate.contract.validation.ValidationException: (unknown source position): Accessor user of biz.xxxxx.xxx.api.params.profile.ValidateProfileParams: An interface type cannot be an xml type.
Problema: Dentro de la clase se utiliza la anotación @XmlRootElement(«<nombre>»). Produce un error dado que el tipo del recuperador de la clase es RepositoryItem de atg y no es correcto.
La interfície no puede utilizar este tipo dado que no es XML.
Dos posibles soluciones:
1) Eliminar el tipo de repositoryItem y utilizar el tipo String modificando también los nombres del objecto Params (de object a userId).
2) Eliminar la notación @XmlRootElement de la clase para que no sea detectada por Swagger.
Información adicional:

Orden de ejecución de los métodos de un test case de JUnit4

Deprecated

Aunque quizá JUnit4 sea el framework de testing más extendido en el ecosistema Java, adolece de ciertas limitaciones «de fábrica» que según como se mire son difíciles de explicar. Una de ellas para mi gusto es la dificultad de poder marcar el orden de ejecución de los métodos de una clase de test de forma sencilla. Entiendo que mirándolo de una forma purista cada uno de los métodos de un test case debe ser independiente y su ejecución no se debería ver afectada por el resto, pero en determinados casos es de mucha ayuda poder marcar el orden de ejecución, como por ejemplo poder probar la conexión a una fuente de datos antes de obtener los datos.

En este articulo se pretende exponer diferentes alternativas para dar respuesta a este caso de uso.

Seguir leyendo Orden de ejecución de los métodos de un test case de JUnit4

Las 14 mejores prácticas para utilizar JMeter

-No utilizar la consola para preparar las pruebas de carga. Utilizar la consola para depurar o para ejecutar pruebas pequeñas de carga para verificar que el script se ejecuta correctamente es correcto. El GUI consume una gran cantidad de memoria bajo una gran carga, por tanto, la consola no puede soportar por sí misma una carga grande.

-Utilizar servidores remotos para crear la carga. Utilizar la opción de «Remote Start All» o «Remote Start» de los servidores individuales. 

-Limitar el número de hilos por motor de pruebas a un máximo de 300. Esto implica que el número total de hilos generados por Test Plan que se haya generado debe ser inferior a 300. Por ejemplo, un test plan de 200 hilos y 4 motores de pruebas generarán una carga de 800 hilos. 

-Desactivar la opción del listener «View Result Tree» pues consume mucha memoria y puede provocar que se congele la consola o que el JMeter tenga un desbordamiento de memoria. Sin embargo, sí que es recomendable utilizar el listener «View Result Tree» cuando se marca la opción Errores. 

-Desactivar todos los grafos del JMeter pues consumen una gran cantidad de memoria. Se pueden visualizar todos los grafos de tiempo real utilizando la pestaña de JTL en la interfaz web.

-Monitorizar los ficheros de log. Cualquier error en el Test Plan o en el propio Test puede aparecer en los ficheros de log que se encuentran disponibles en la pestaña de Logs. Por ejemplo: errores de Out of Memory, desconexiones, etc.

-No olvidar borrar la ruta local del archivo de configuración utilizado como conjunto de datos (CSV Fecha Siete Config) si se ha usado alguno.

-Los nombres de archivo deben incluir solamente caracteres alfanuméricos, guiones bajos o guiones normales: [0-9], [aA-zz], [_-]. Los nombres de archivo siempre deberían incluir la extensión. 

-Limpiar las pestañas de archivos antes de cada prueba de ejecución del Test Plan. 

-Cuando se utilicen ficheros JTL, asignar nombres con significado a los ficheros pertinentes. Por ejemplo: 150210-4000t-1.jtl. No emplear espacios como separadores en los nombres de los ficheros JTL. 

-Asegurarse que el fichero JTL se guarda en formato XML i no en formato CSV. 

-Acceder al menos una vez en las pestañas JTL para generar informes en tiempo real. 

-Utilizar nombres cortos y significativos para las etiquetas para identificar controladores y creadores de muestras (por ejemplo las peticiones HTTP). Si se utilizan nombres largos, estos nombres ocuparán la mejor sección de los grafos generados utilizando las pestañas de los JTL llegando a molestar cuando se estudien los resultados. 

-Intentar hacer pruebas con el JMeter en la nube: enlace, enlace, enlace, etc …

JMeter – Plugin Statistical Aggregate Report

Página principal

http://rubenlaguna.com/wp/better-jmeter-graphs/

Visión General

Muestra de una manera diferente de presentar los datos de forma más clara y sencilla que los informes estándar por defecto del JMeter.

A grandes rasgos, el eje vertical de la izquierda indica el ratio de salida, el número de hilos por segundo durante la ejecución y el eje horizontal muestra el tiempo en el que se ha ejecutado la prueba. Por último, el eje vertical de la derecha muestra el tiempo de respuesta de todas las muestras.

Así, con este informe se puede ver la interacción entre el tiempo de la prueba, el número de hilos cargados por segundo y el tiempo de respuesta para cada uno de ellos.

http://rubenlaguna.com/wp/wp-content/uploads/2006/12/stataggvisualizer.zip

Instalación

Aunque se detalla en la propia página oficial incluye el proceso de instalación como guía rápida.

La instalación se ha efectuado en la versión Apache JMeter (2.11 r1554548) del JMeter.

Para instalar el añadido evidentemente es necesario disponer del fichero StatAggVisualizer.zip. 

Hay que descomprimir el archivo completo. Seguidamente hay que acceder al directorio de instalación del 2.2.

El archivo comprimido dispone de cuatro archivos en su interior: Tres de ellos vale directamente a la carpeta $JMETER_HOME/lib y los otros fichero hay que colocarlos directamente en el directorio $JMETER_HOME/lib/ext.

Cuando se descomprime el archivo ya se genera la estructura de archivos apropiada, como por si acaso, los archivos jcommon-1.0.5.jar, jdnc-0.6-all.jar i el fitxer jfreechart-1.0.2.jar hace falta colocarlos directamente a la carpeta $JMETER_HOME/lib y el jar StatAggVisualizer.jar es necesario también colocarlo en $JMETER_HOME/lib/ext.

Una vez instalado, es necesario arrancar el JMeter y podrá verse la opción de «Statistical Aggregate Report» en la opción de menú Añadir -> Receptor haciendo clic sobre el Grupo de Hilos con el botón derecho del ratón.