Important
翻译是一项社区工作:ref:you can join <translation_guidelines>。此页面目前翻译进度为 100.00%。
7. Processing 算法测试
7.1. 算法测试
Note
这些说明的原始版本可在 https://github.com/qgis/QGIS/blob/release-3_40/python/plugins/processing/tests/README.md 获取
QGIS 在 Processing 框架下提供了多个算法。您可以扩展该列表,添加自己的算法,并且与任何新功能一样,必须添加测试。
要测试算法,您可以根据需要将条目添加到 testdata/qgis_algorithm_tests.yaml 或 testdata/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. 操作方法
要添加新测试,请按以下步骤操作:
在 QGIS 中通过 Processing toolbox 运行您要测试的 algorithm。如果结果是矢量图层,建议使用 GML(附带 XSD)作为输出格式,因其支持混合几何类型且可读性好。将输出重定向至
python/plugins/processing/tests/testdata/expected。输入图层请优先使用testdata文件夹中已有的数据;如需额外数据,请放入testdata/custom。运行完算法后,请进入 ,找到刚刚运行的算法。
右键单击该算法,然后点击 Create Test。将打开一个包含文本定义的新窗口。
打开文件
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
图层类型参数
您通常需要将图层指定为参数。为此,需指定以下内容:
类型,即
vector或raster名称,使用类似
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:27700ellipsoid—— 覆盖用于测量的默认工程椭球体,例如GRS80
7.1.4. 本地运行测试
ctest -V -R ProcessingQgisAlgorithmsTest
或使用 CMakelists.txt 中列出的以下值之一