6. Prueba de algoritmos de procesamiento

6.1. Pruebas de algoritmo

Nota

La versión original de estas instrucciones está disponible en https://github.com/qgis/QGIS/blob/release-3_16/python/plugins/processing/tests/README.md

QGIS proporciona varios algoritmos en el marco de procesamiento. Usted puede ampliar esta lista con algoritmos propios y, como cualquier característica nueva, es necesario agregar pruebas.

Para probar algoritmos, puede agregar entradas en testdata/qgis_algorithm_tests.yaml or testdata/gdal_algorithm_tests.yaml as appropriate.

Este archivo tiene la estructura de yaml syntax.

Un texto básico aparece bajo la llave del nivel principal tests y se ve así:

- name: centroid
  algorithm: qgis:polygoncentroids
  params:
    - type: vector
      name: polys.gml
  results:
    OUTPUT_LAYER:
      type: vector
      name: expected/polys_centroid.gml

6.1.1. Cómo

Para agregar una nueva prueba, siga estos pasos:

  1. Ejecutar algorithm que se desea comprobar en QGIS desde el processing toolbox. Si el resultado es una capa de linea escoja un GML, con su correspondiente XSD, como salida compatible con tipos de geometría mixta y buena legibilidad. Redirecione la salida a python/plugins/processing/tests/testdata/expected. Para las capas de entrada elegidas usar lo que ya hay en la carpeta testdata. Si se necesitan datos adicionales, se ponen en testdata/custom.

  2. Cuando tenga que ejecutar el algoritmo vaya a Processing ► History y busque el algoritmo que acaba de ejecutar.

  3. Click con el botón derecho en el algoritmo y click en Create Test. Se abrirá una nueva ventana para poner nombre al algoritmo.»

  4. Abra el fichero python/plugins/processing/tests/testdata/algorithm_tests.yaml, copie ahí el nombre del algoritmo.

La primera cadena de caracteres del comando va a la tecla algoritmo, las siguientes a parametros y la(s) última(s) a resultado(s).

Lo anterior se traduce en

- name: densify
  algorithm: qgis:densifygeometriesgivenaninterval
  params:
    - type: vector
      name: polys.gml
    - 2 # Interval
  results:
    OUTPUT:
      type: vector
      name: expected/polys_densify.gml

También es posible crear pruebas para los scripts de Procesamiento. Los scripts deberían situarse en el scripts en el subdirectorio de los datos de test python/plugins/processing/tests/testdata/. El nombre del fichero script debería coincidir con el nombre del script del algoritmo.»

6.1.2. Parámetros y resultados

Parámetros tipo trivial

Los parámetros y resultados se especifican como diccionarios y listas:

params:
  INTERVAL: 5
  INTERPOLATE: True
  NAME: A processing test

o

params:
  - 2
  - string
  - another param

Parámetros tipo capa

A menudo se necesitará especificar las capas como parámetros. Para especificar una capa, deberá especificar:

  • el tipo, p. ej. «vector» o «raster»

  • un nombre, con un path relativo como expected/polys_centroid.gml

Así es como se muestra en realidad:

params:
  PAR: 2
  STR: string
  LAYER:
    type: vector
    name: polys.gml
  OTHER: another param

Parámetros tipo archivo

Si necesita un archivo externo para probar de algoritmo, necesita especificar el tipo de “archivo” y el path (relativo) al archivo con su “nombre”

params:
  PAR: 2
  STR: string
  EXTFILE:
    type: file
    name: custom/grass7/extfile.txt
  OTHER: another param

Resultados

Los resultados se especifican de manera muy similar.

Archivos vector básicos

No podría ser más trivial

OUTPUT:
 name: expected/qgis_intersection.gml
 type: vector

Agregue los archivos GML y XSD esperados en la carpeta.

Vector con tolerancia

A veces, diferentes plataformas crean resultados ligeramente diferentes que aún son aceptables. En este caso (pero solo entonces) se puede también usar propiedades adicionales para definir cómo se compara una capa.

Para trabajar con una cierta tolerancia para los valores de salida, se puede especificar una propiedad de comparación para una salida. La propiedad de comparación puede contener sub-propiedades para campos. Esto contiene información sobre con qué precisión se compara un determinado campo (precisión) o incluso puede ser omitida. Hay un nombre de campo especial __all__, el cual aplica una tolerancia a todos los campos. Hay otra propiedad geometría que también acepta una precisión que se aplicará a todos los vértice.

OUTPUT:
 type: vector
 name: expected/abcd.gml
 compare:
   fields:
     __all__:
       precision: 5 # compare to a precision of .00001 on all fields
     A: skip # skip field A
   geometry:
     precision: 5 # compare coordinates with a precision of 5 digits
Archivos ráster

Los archivos raster se comparan con una función hash de suma de verificación. Esto se calcula cuando se crea un test desde la historia del procesamiento.

OUTPUT:
 type: rasterhash
 hash: f1fedeb6782f9389cf43590d4c85ada9155ab61fef6dc285aaeb54d6
Archivos

Se puede comparar el contenido de un archivo de salida con un archivo de referencia de resultados esperados

OUTPUT_HTML_FILE:
 name: expected/basic_statistics_string.html
 type: file

O puede usar una o más expresiones regulares que serán verificadas <https://docs.python.org/3/library/re.html#re.search>`_ con el archivo «contenido»

OUTPUT:
 name: layer_info.html
 type: regex
 rules:
   - 'Extent: \(-1.000000, -3.000000\) - \(11.000000, 5.000000\)'
   - 'Geometry: Line String'
   - 'Feature Count: 6'
Directorios

Se puede comparar el contenido de un directorio de salida con un resultado esperado del directorio de referencia

OUTPUT_DIR:
 name: expected/tiles_xyz/test_1
 type: directory

6.1.3. Contexto Algoritmo

Hay algunas definiciones más que pueden modificar el contexto del algoritmo; estas se pueden especificar en el nivel superior de la prueba:

  • project - cargará un proyecto QGIS específico antes de ejecutar el algoritmo. Si no se especifica, el algoritmo se ejecutará con un proyecto vacío.

  • project_crs - sobrescribe el CRS del proyecto predeterminado - p. ej. EPSG:27700

  • ellipsoid - sobreescribe el elipsoide proyecto predeterminado usado para mediciones, p. ej. GRS80

6.1.4. Ejecutando pruebas localmente

ctest -V -R ProcessingQgisAlgorithmsTest

o alguno de los siguientes valores enumerados en CMakelists.txt