7. 处理算法测试

7.1. 算法测试

备注

这些说明的原始版本可在以下网址获得 https://github.com/qgis/QGIS/blob/master/python/plugins/processing/tests/README.md

QGIS在处理框架下提供了几种算法。您可以使用自己的算法来扩展此列表,并且,像任何新功能一样,添加测试是必需的。

要测试算法,可以将条目添加到 testdata/qgis_algorithm_tests.yamltestdata/gdal_algorithm_tests.yaml 视情况而定。

此文件的结构为 yaml syntax

基本测试将显示在顶层键下 tests 看起来是这样的:

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

7.1.1. 如何操作

要添加新测试,请执行以下步骤:

  1. 运行 algorithm 您想要在QGIS中从 processing toolbox 。如果结果是一个矢量层,最好使用GML及其XSD作为输出,因为它支持混合的几何类型和良好的可读性。将输出重定向到 python/plugins/processing/tests/testdata/expected 。对于输入图层,首选使用文件夹中已有的内容 testdata 。如果您需要额外的数据,请将其放入 testdata/custom

  2. 运行完算法后,请转到 Processing ► History 并找到您刚刚运行的算法。

  3. 右键单击该算法,然后单击 Create Test 。将打开一个带有文本定义的新窗口。

  4. 打开文件 python/plugins/processing/tests/testdata/algorithm_tests.yaml ,将文本定义复制到那里。

命令中的第一个字符串转到键 algorithm ,后续的 params 最后一位(S) results

以上内容可翻译为

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

还可以创建用于处理脚本的测试。脚本应放在 scripts 测试数据目录中的子目录 python/plugins/processing/tests/testdata/ 。脚本文件名应与脚本算法名称匹配。

7.1.2. 参数和结果

平凡的类型参数

参数和结果以列表或词典的形式指定:

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

params:
  - 2
  - string
  - another param

层类型参数

您通常需要将层指定为参数。要指定一个层,您需要指定:

  • 类型,即 vectorraster

  • 一个名称,具有如下的相对路径 expected/polys_centroid.gml

这就是它在行动中的样子:

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

文件类型参数

如果您需要用于算法测试的外部文件,您需要在文件的‘name’中指定文件的‘file’类型和(相对)路径:

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

结果

结果的指定方式非常相似。

基本矢量文件

这是再微不足道的事了

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

在文件夹中添加预期的GML和XSD文件。

带公差的矢量

有时,不同的平台产生的结果略有不同,这仍然是可以接受的。在这种情况下(但只有在这种情况下),您还可以使用其他属性来定义如何比较层。

要处理输出值的某个容差,可以指定 compare 属性来获取输出。比较属性可以包含的子属性 fields 。它包含有关比较某个字段的精确度的信息 (precision )或一个字段甚至可以完全 skip 艾德有一个特殊的字段名称 __all__ 这将对所有领域应用一定的容差。还有一处房产 geometry 它还接受一个 precision 它被应用于每个顶点。

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
栅格文件

将栅格文件与散列校验和进行比较。这是在您从处理历史记录创建测试时计算的。

OUTPUT:
 type: rasterhash
 hash: f1fedeb6782f9389cf43590d4c85ada9155ab61fef6dc285aaeb54d6
档案

您可以将输出文件的内容与预期结果引用文件进行比较

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

或者,您可以使用一个或多个正则表达式 matched 对照文件内容

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

您可以将输出目录的内容与预期结果引用目录进行比较

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

7.1.3. 算法上下文

还有一些可以修改算法上下文的定义--这些定义可以在测试的顶层指定:

  • project -将在运行算法之前加载指定的QGIS项目文件。如果未指定,则算法将与空项目一起运行

  • project_crs - overrides the default project CRS - e.g. EPSG:27700

  • ellipsoid - overrides the default project ellipsoid used for measurements, e.g. GRS80

7.1.4. 在本地运行测试

ctest -V -R ProcessingQgisAlgorithmsTest

中列出的下列值之一。 CMakelists.txt