6. Teste de Processamento de Algoritmos

6.1. Teste de algoritmos

Nota

A versão original destas instruções está disponível em https://github.com/qgis/QGIS/blob/release-3_16/python/plugins/processing/tests/README.md

QGIS fornece vários algoritmos sob a estrutura de processamento. Você pode estender esta lista com seus próprios algoritmos e, como qualquer novo recurso, é necessário adicionar testes.

Para testar algoritmos, você pode adicionar entradas em testdata/qgis_algorithm_tests.yaml ou testdata/gdal_algorithm_tests.yaml como apropriado.

Este arquivo está estruturado com sintaxe yaml.

Um teste básico aparece sob a chave de nível superior “tests” e tem a seguinte aparência:

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

6.1.1. Como

Para adicionar um novo teste siga estas etapas:

  1. Execute algorithm se você deseja testar no QGIS a partir do processing toolbox. Se o resultado for uma camada vetorial prefira o GML, com seu XSD, como saída pelo suporte de tipos de geometria mista e boa legibilidade. Redirecione a saída para python/plugins/processing/tests/testdata/expected. Para as camadas de entrada prefira usar o que já existe na pasta testdata. Se você precisar de dados extras, coloque-o em testdata/custom.

  2. Quando você executar o algoritmo, vá para Processar ► Histórico e encontre o algoritmo que você acabou de executar.

  3. Clique com o botão direito do mouse no algoritmo e clique em Criar Teste. Uma nova janela será aberta com uma definição de texto.

  4. Abra o arquivo python/plugins/processing/tests/testdata/algoritm_tests.yaml, copie a definição de texto lá.

A primeira string do comando vai para a chave algoritmo, as subsequentes para params e a última(s) para resultados.

O acima se traduz em

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

Também é possível criar testes para scripts de processamento. Os scripts devem ser colocados no subdiretório scripts no diretório de dados de teste python/plugins/processing/tests/testdata/. O nome do arquivo de script deve corresponder ao nome do algoritmo de script.

6.1.2. Parâmetros e resultados

6.1.2.1. Tipos de parâmetros triviais

Parâmetros e resultados são especificados como listas ou dicionários:

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

ou

params:
  - 2
  - string
  - another param

6.1.2.2. Parâmetros do tipo camada

Você muitas vezes precisará especificar camadas como parâmetros. Para especificar uma camada, você precisará especificar:

  • o tipo, ou seja, vetor ou raster

  • um nome, com um caminho relativo como expected/polys_centroid.gml

É assim que parece em ação:

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

6.1.2.3. Parâmetros do tipo de arquivo

Se você precisar de um arquivo externo para o teste do algoritmo, precisará especificar o tipo ‘arquivo’ e o caminho (relativo) para o arquivo em seu ‘nome’:

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

6.1.2.4. Resultados

Os resultados são especificados de maneira muito semelhante.

6.1.2.4.1. Arquivos vetoriais básicos

Não poderia ser mais trivial

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

Adicione os arquivos GML e XSD esperados na pasta.

6.1.2.4.2. Vetor com tolerância

Às vezes, plataformas diferentes criam resultados ligeiramente diferentes que ainda são aceitáveis. Nesse caso (mas somente então), você também pode usar propriedades adicionais para definir como uma camada é comparada.

Para lidar com uma certa tolerância para os valores de saída, você pode especificar uma propriedade compare para uma saída. A propriedade compare pode conter subpropriedades para campos. Isso contém informações sobre a precisão de comparação de um determinado campo (precisão) ou um campo pode ser inteiramente ignorado. Existe um nome de campo especial __todos__ que aplicará uma certa tolerância a todos os campos. Existe outra propriedade geometria que também aceita uma precisão que é aplicada a cada vértice.

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. Arquivos raster

Arquivos raster são comparados com uma soma de verificação de hash. Isso é calculado quando você cria um teste a partir do histórico de processamento.

OUTPUT:
 type: rasterhash
 hash: f1fedeb6782f9389cf43590d4c85ada9155ab61fef6dc285aaeb54d6
6.1.2.4.4. Arquivos

Você pode comparar o conteúdo de um arquivo de saída com um arquivo de referência de resultado esperado

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

Ou você pode usar uma ou mais expressões regulares que serão matched com o conteúdo do arquivo

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. Diretórios

Você pode comparar o conteúdo de um diretório de saída com um diretório de referência de resultado esperado

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

6.1.3. Contexto do algoritmo

Existem mais algumas definições que podem modificar o contexto do algoritmo - estas podem ser especificadas no nível superior do teste:

  • projeto - carregará um arquivo de projeto QGIS especificado antes de executar o algoritmo. Se não especificado, o algoritmo será executado com um projeto vazio

  • project_crs - substitui o SRC do projeto padrão - e.g. EPSG:27700

  • elipsóide - substitui o elipsóide padrão do projeto usado para medições, e.g. GRS80

6.1.4. Executar testes localmente

ctest -V -R ProcessingQgisAlgorithmsTest

ou um dos seguintes valores listados em CMakelists.txt