7. Testen van algoritmes voor Processing
7.1. Testen voor algoritmes
Notitie
De originele versie van deze instructies is beschikbaar op https://github.com/qgis/QGIS/blob/release-3_28/python/plugins/processing/tests/README.md
QGIS verschaft verscheidene algoritmes in het framework Processing. U kunt die lijst uitbreiden met uw eigen algoritmes en, net als met elke nieuwe mogelijkheid, is het toevoegen van testen vereist.
U kunt, om algoritmes 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
7.1.1. Hoe te doen
Volg deze stappen om een nieuwe test toe te voegen:
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 maptestdata
staat. Als u extra gegevens nodig hebt, plaats die dan intestdata/custom
.Wanneer u het algoritme hebt uitgevoerd, ga naar
en zoek naar het algoritme dat u zojuist hebt uitgevoerd.Klik met rechts op het algoritme en klik op Test maken. Een nieuw venster zal openen met een tekstdefinitie.
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.
7.1.2. Parameters en resultaten
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
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
ofraster
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
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
Resultaten
Resultaten worden op zeer soortgelijke manier gespecificeerd.
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.
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
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
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'
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
7.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 projectproject_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
7.1.4. Testen lokaal uitvoeren
ctest -V -R ProcessingQgisAlgorithmsTest
of één van de volgende waarden die zijn vermeld in de CMakelists.txt