7. Test degli Algoritmi di Processing

7.1. Test degli algoritmi

Nota

La versione originale di queste istruzioni é disponibile presso https://github.com/qgis/QGIS/blob/release-3_22/python/plugins/processing/tests/README.md

QGIS fornisce numerosi algoritmi nel Processing framework. È possibile estendere questo elenco con algoritmi propri e, come ogni nuova funzionalità, è richiesta l’aggiunta di test.

Per testare gli algoritmi è possibile aggiungere voci in testdata/qgis_algorithm_tests.yaml oppure :file:testdata/gdal_algorithm_tests.yaml` come piú opportuno.

This file is structured with yaml syntax.

A basic test appears under the top level key tests and looks like this:

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

7.1.1. Come fare

Per aggiungere un nuovo test, segui questi passi:

  1. Esegui il algoritmo che vuoi testare in QGIS dal processing toolbox. Se il risultato è un layer vettoriale preferisci GML, con il suo XSD, come output per il suo supporto di tipi di geometria misti e buona leggibilità. Reindirizza l’output a python/plugins/processing/tests/testdata/expected. Per i layer di input preferisci usare ciò che è già presente nella cartella testdata. Se hai bisogno di dati extra, mettili in testdata/custom.

  2. Quando hai eseguito l’algoritmo, vai a Processing ► History e trova l’algoritmo che hai appena eseguito.

  3. Clicca con il tasto destro sull’algoritmo e clicca su Create Test. Si aprirà una nuova finestra con una definizione testuale.

  4. Apri il file python/plugins/processing/test/testdata/algorithm_tests.yaml, copia lì la definizione del testo.

La prima stringa del comando va alla chiave algoritmo, le successive a params e le ultime a results.

Quanto sopra si traduce in

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

È anche possibile creare dei test per gli script di Processing. Gli script dovrebbero essere collocati nella sottocartella scripts all’interno della cartella dei dati di test :file:python/plugins/processing/tests/testdata/`. Il nome del file di script deve corrispondere al nome dell’algoritmo di script.

7.1.2. Parametri e risultati

Parametri di tipo semplice

I parametri e i risultati sono specificati come liste o cartelle:

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

o

params:
  - 2
  - string
  - another param

Parametri tipo layer

Avrai spesso bisogno di specificare i layer nei parametri. Per specificare un layer dovrai specificare:

  • il tipo, ad esempio vettore` o raster

  • un nome, con un percorso relativo come expected/polys_centroid.gml.

Ecco come appare in pratica:

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

Parametri per il tipo di file

Se hai bisogno di un file esterno per il test dell’algoritmo, devi specificare il tipo di “file” e il percorso (relativo) del file col suo “nome”:

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

Risultati

I risultati vanno specificati in modo molto simile.

Base per file vettoriali

Non potrebbe essere più banale

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

Aggiunge i file GML e XSD previsti nella cartella.

Vettore con tolleranza

A volte piattaforme diverse creano risultati leggermente diversi che sono ancora accettabili. In questo caso (ma solo in questo caso) puoi anche usare proprietà aggiuntive per definire come un layer viene valutato.

Per gestire con una determinata tolleranza i valori dell’output puoi specificare una proprietà compare per un output. La proprietà compare può contenere sotto-proprietà per i campi. Questo contiene informazioni su quanto precisamente un certo campo è confrontato (precision) o un campo può anche essere completamente skip. C’è un nome di campo speciale __all__ che applicherà una certa tolleranza a tutti i campi. C’è un’altra proprietà geometry che accetta anche una precision che viene applicata ad ogni vertice.

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
File raster

I file raster vengono testati con un checksum hash. Questo viene calcolato quando si crea un test dal processing history.

OUTPUT:
 type: rasterhash
 hash: f1fedeb6782f9389cf43590d4c85ada9155ab61fef6dc285aaeb54d6
File

Puoi confrontare il contenuto di un file di output con un file di riferimento dei risultati attesi

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

Oppure puoi usare una o più espressioni regolari che saranno abbinate https://docs.python.org/3/library/re.html#re.search al contenuto del file

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

Puoi confrontare il contenuto di una cartella di output con una cartella di riferimento dei risultati attesi

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

7.1.3. Contesto dell’algoritmo

Ci sono alcune altre definizioni che possono modificare il contesto dell’algoritmo - queste possono essere specificate al livello superiore del test:

  • project - caricherà un file di progetto QGIS specificato prima di eseguire l’algoritmo. Se non specificato, l’algoritmo verrà eseguito in un progetto vuoto

  • project_crs - sovrascrive il SR di default del progetto - ad esempio EPSG:27700.

  • ellipsoid - sovrascrive l’ellissoide di default del progetto usato per le misure, ad esempio GRS80.

7.1.4. Esecuzione dei test in locale

ctest -V -R ProcessingQgisAlgorithmsTest

o uno dei seguenti valori elencati nel file CMakelists.txt