6. Testen van algoritmen voor Processing

6.1. Testen voor algoritmen

Notitie

De originele versie van deze instructies is beschikbaar op https://github.com/qgis/QGIS/blob/release-3_16/python/plugins/processing/tests/README.md

QGIS verschaft verscheidene algoritmen in het framework Processing. U kunt die lijst uitbreiden met uw eigen algoritmen en, net als met elke nieuwe mogelijkheid, is het toevoegen van testen vereist.

U kunt, om algoritmen te testen, items toevoegen aan testdata/qgis_algorithm_tests.yaml of testdata/gdal_algorithm_tests.yaml indien van toepassing.

Dit bestand is gestructureerd met yaml-syntaxis.

Een basistest verschijnt onder de sleutel op het hoogste niveau tests en ziet er uit als dit:

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

6.1.1. Hoe te doen

Volg deze stappen om een nieuwe test toe te voegen:

  1. Voer het algoritme dat u wilt testen uit in QGIS vanuit de Toolbox van Processing. Als het resultaat een vectorlaag is, dan bij voorkeur GML, met zijn XSD, als uitvoer voor zijn ondersteuning van gemixte typen geometrie en goede leesbaarheid. Verplaats de uitvoer naar python/plugins/processing/tests/testdata/expected. Gebruik bij voorkeur voor invoerlagen dat wat al in de map testdata staat. Als u extra gegevens nodig hebt, plaats die dan in testdata/custom.

  2. Wanneer u het algoritme hebt uitgevoerd, ga naar Processing ► Geschiedenis en zoek naar het algoritme dat u zojuist hebt uitgevoerd.

  3. Klik met rechts op het algoritme en klik op Test maken. Een nieuw venster zal openen met een tekstdefinitie.

  4. Open het bestand python/plugins/processing/tests/testdata/algorithm_tests.yaml en kopieer de tekstdefinitie naar hier.

De eerste tekenreeks van de opdracht gaat naar de sleutel algorithm, de volgende naar params en de laatste(n) naar results.

Bovenstaande laat zich vertalen als

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

Het is ook mogelijk testen te maken voor scripts van Processing. Scripts zouden moeten worden geplaatst in de submap scripts in de map voor de testdata python/plugins/processing/tests/testdata/. De bestandsnaam van het script zou overeen moeten komen met de naam van het scriptalgoritme.

6.1.2. Parameters en resultaten

6.1.2.1. Triviale typen parameters

Parameters en resultaten worden gespecificeerd als lijsten of woordenboeken:

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

of

params:
  - 2
  - string
  - another param

6.1.2.2. Typen parameters voor lagen

U zult vaak lagen dienen te specificeren als parameters. U dient, om een laag te specificeren, te specificeren:

  • het type, d.i. vector of raster

  • een naam, met een relatief pad zoals expected/polys_centroid.gml

Dit is hoe het er in actie uitziet:

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

6.1.2.3. Typen parameters voor bestanden

Als u een extern bestand nodig hebt voor de test van het algoritme, dient u het type ‘file’ te specificeren en het (relatieve) pad naar het bestand in zijn ‘naam’:

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

6.1.2.4. Resultaten

Resultaten worden op zeer soortgelijke manier gespecificeerd.

6.1.2.4.1. Basis vectorbestanden

Het zou niet minder triviaal kunnen zijn

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

Voeg de verwachte GML- en XSD-bestanden toe aan de map.

6.1.2.4.2. Vector met tolerantie

Soms maken verschillende platforms enigszins verschillende resultaten die nog steeds acceptabel zijn. In dit geval (maar ook alleen dan) mag u ook aanvullende eigenschappen gebruiken om te definiëren hoe een laag is vergeleken.

Voor het afhandelen van een bepaalde tolerantie voor de waarden van de uitvoer kunt u een eigenschap compare specificeren voor een uitvoer. De eigenschap compare mag bepaalde sub-eigenschappen bevatten voor fields. Die bevatten informatie over hoe precies een bepaald veld is vergeleken (precision) of een veld kan zelfs in zijn geheel worden ge``skip``t. Er bestaat een speciale veldnaam __all__ die een bepaalde tolerantie op alle velden zal toepassen. Er is een andere eigenschap geometry die ook een precision accepteert die wordt toegepast op elk punt.

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
6.1.2.4.3. Rasterbestanden

Rasterbestanden worden vergeleken met een hash checksum. Die wordt berekent als u een test maakt uit de Geschiedenis van Processing.

OUTPUT:
 type: rasterhash
 hash: f1fedeb6782f9389cf43590d4c85ada9155ab61fef6dc285aaeb54d6
6.1.2.4.4. Bestanden

U kunt de inhoud van een uitvoerbestand vergelijken met een verwijzingsbestand voor het verwachte resultaat

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

Of u kunt een of meer reguliere expressies gebruiken die zullen worden vergeleken met de inhoud van het bestand

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

U kunt de inhoud van een map voor de uitvoer vergelijken met een verwijzingsmap voor het verwachte resultaat

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

6.1.3. Context voor het algoritme

er zijn nog een aantal definities die de context van het algoritme kunnen aanpassen - deze mogen worden gespecificeerd in het hoogste niveau van de test:

  • project - zal een gespecificeerd projectbestand van QGIS laden voordat het algoritme wordt uitgevoerd. Indien niet gespecificeerd zal het algoritme worden uitgevoerd met een leeg project

  • project_crs - overschrijft het standaard project-CRS - bijv. EPSG:27700

  • ellipsoid - overschrijft de standaard ellipsoïde voor het project die wordt gebruikt voor metingen, bijv. GRS80

6.1.4. Testen lokaal uitvoeren

ctest -V -R ProcessingQgisAlgorithmsTest

of één van de volgende waarden die zijn vermeld in de CMakelists.txt