Important

翻译是一项社区工作:ref:you can join <translation_guidelines>。此页面目前翻译进度为 100.00%。

7. Processing 算法测试

7.1. 算法测试

QGIS 在 Processing 框架下提供了多个算法。您可以扩展该列表,添加自己的算法,并且与任何新功能一样,必须添加测试。

要测试算法,您可以根据需要将条目添加到 testdata/qgis_algorithm_tests.yamltestdata/gdal_algorithm_tests.yaml 中。

该文件采用 YAML 语法 编写。

一个基本测试位于顶级键 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. 在 QGIS 中通过 Processing toolbox 运行您要测试的 algorithm。如果结果是矢量图层,建议使用 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,最后一个(或多个)对应 results

上述内容转换为

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

也可以为 Processing 脚本创建测试。脚本应放在测试数据目录 python/plugins/processing/tests/testdata/ 下的 scripts 子目录中,且脚本文件名应与脚本算法名称一致。

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

文件类型参数

如果算法测试需要外部文件,需指定类型为 'file',并在其 'name' 字段中提供(相对)路径:

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

栅格文件通过哈希校验和进行比较。该哈希值在从 Processing 历史记录创建测试时自动生成。

OUTPUT:
 type: rasterhash
 hash: f1fedeb6782f9389cf43590d4c85ada9155ab61fef6dc285aaeb54d6
文件

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

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

或者,您可以使用一个或多个正则表达式,对文件内容进行 匹配

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 —— 覆盖默认工程坐标系,例如 EPSG:27700

  • ellipsoid —— 覆盖用于测量的默认工程椭球体,例如 GRS80

7.1.4. 本地运行测试

ctest -V -R ProcessingQgisAlgorithmsTest

或使用 CMakelists.txt 中列出的以下值之一