Skip to content

Orientações para Desenvolvedores (Testes de Algoritmos)

João P. Esperidião edited this page Oct 17, 2019 · 3 revisions

O uso de unit tests no DSGTools

A fim de garantir a qualidade de resultados e a consistência de resultados dos algoritmos disponibilizados pelo DSGTools Provider, introduziu-se um protótipo de Unit Test.

Neste protótipo, há apenas os testes para algoritmos de saída simples:

  • os que geram uma camada de saída de flags apontadas;
  • os que geram uma camada de saída de output (camada derivada da de entrada, porém não é a mesma); e
  • algoritmos que alteram a própria camada de entrada e, assim, a saída seria "ela mesma".

Ressalta-se que, devido às traduções serem um fator que adultera o teste de comparação (a camada exportada fica com a mensagem traduzida enquanto a de execução depende da seleção do usuário no momento), escolheu-se padronizar que todas as os testes deverão ser realizado com o QGIS em INGLÊS.

Funcionamento dos testes

Os testes possuem um comportamento simples:

  1. ler as camadas de entrada do algoritmo a ser testado da base de dados de testes (e.g. banco_capacitacao.sqlite);
  2. executar o algoritmo a ser testado e alocar a camada de saída, se houver, a uma variável;
  3. ler a camada de resultados esperados da base de dados de resultados esperados (~/DsgTools/tests/expected_outputs/NOMEALG/test_NRTEST)

repare que NOMEALG refere-se ao nome do algoritmo a ser executado (e.g. identifyoverlaps) e NRTEST é o índice dos parâmetros do test case conforme consta no mapa de parâmetros de testes apresentado no método algorithmParameters

  1. comparar o resultado de execução com a camada de saída esperada.

Registrando um novo teste

Os testes buscam abarcar casos de uso da ferramenta em situação de produção e, assim, é necessário que um mesmo algoritmo seja testado sob diversos cenários possíveis. Assim, pode-se adicionar vários test cases a um mesmo algoritmo.

Adicionando um test case para um algoritmo já registrado

O primeiro cenário apresentado é o de simples adição de um cenário de testes a um algoritmo que já possui sua estrutura criada e já possui ao menos um test case criado e em funcionamento.


Suponha que se deseja adicionar um teste ao algoritmo dsgtools:identifyduplicatedfeatures e que o objeto de parâmetros de testes seja:

parameters = {
            "dsgtools:identifyduplicatedfeatures" : [
                {
                    '__comment' : "'Normal' test: checks if it works.",
                    'ATTRIBUTE_BLACK_LIST' : [],
                    'FLAGS' : "memory:",
                    'IGNORE_PK_FIELDS' : True,
                    'IGNORE_VIRTUAL_FIELDS' : True,
                    'INPUT' : self.getInputLayers(
                            'sqlite', 'banco_capacitacao',
                            ['cb_rel_ponto_cotado_altimetrico_p']
                        )[0],
                    'SELECTED' : False
                }
            ]
}

Da observação do objeto de parâmetros, nota-se que há apenas um mapa de parâmetros de execução deste algoritmo. Assim, sabe-se que o novo teste de execução será o segundo (e.g. NREXEC = 2). Repare que o parâmetro INPUT recebe uma camada lida do banco de testes banco_capacitacao, que é um sqlite. No caso pré-existente, lê-se a camada cb_rel_ponto_cotado_altimetrico_p deste banco.


Para a adição de um teste que, por exemplo, verifique se o resultado esperado na camada gpkg:testes_wgs84.camada_linha_1, que foi alterada da maneira desejada, e, neste caso, deseja-se considerar os campos virtuais, temos que os parâmetros são:

{
    '__comment' : "'Virtual field test: testing behaviour when virtual fields are not ignored.",
    'ATTRIBUTE_BLACK_LIST' : [],
    'FLAGS' : "memory:",
    'IGNORE_PK_FIELDS' : False,
    'IGNORE_VIRTUAL_FIELDS' : True,
    'INPUT' : self.getInputLayers(
            'gpkg', 'testes_wgs84',
            ['camada_linha_1']
        )[0],
    'SELECTED' : False
}

O parâmetro __comment serve apenas para descrever o teste para os demais desenvolvedores. Deve ser sucinto, claro e direto.

Assim, para se adicionar o novo teste, deves-e:

  1. confirmar que o QGIS está em inglês;
  2. executar o algoritmo normalmente pelas diversas opções de execução do QGIS;
  3. confirmar se o resultado é o esperado manualmente/visualmente;
  4. adicionar o novo conjunto de parâmetros ao mapa de parâmetros do método algorithmParameters

Assim, o mapa de parâmetros passa a ser:

parameters = {
        "dsgtools:identifyduplicatedfeatures" :     [
            {
                '__comment' : "'Normal' test: checks if it works.",
                'ATTRIBUTE_BLACK_LIST' : [],
                'FLAGS' : "memory:",
                'IGNORE_PK_FIELDS' : True,
                'IGNORE_VIRTUAL_FIELDS' : True,
                'INPUT' : self.getInputLayers(
                        'sqlite', 'banco_capacitacao',
                        ['cb_rel_ponto_cotado_altimetrico_p']
                    )[0],
                    'SELECTED' : False
            },
            {
                '__comment' : "'Virtual field test: testing behaviour when virtual fields are not ignored.",
                'ATTRIBUTE_BLACK_LIST' : [],
                'FLAGS' : "memory:",
                'IGNORE_PK_FIELDS' : False,
                'IGNORE_VIRTUAL_FIELDS' : True,
                'INPUT' : self.getInputLayers(
                        'gpkg', 'testes_wgs84',
                        ['camada_linha_1']
                    )[0],
                'SELECTED' : False
            }
        ]
}
  1. exportar a camada de saída (observar os casos apontados na primeira parte deste documento) como Geopackage com o nome test_2 (uma vez que NREXEC = 2) tanto para o arquivo, quanto para a camada.

IMPORTANTE: não altere definições da camada de saída (CRS, nome de atributo, etc) e atenção com a coluna de chave primária: se já existir uma coluna OGC_FID use fid (e vice-versa)!

  1. salve o arquivo exportado no diretório ~/DsgTools/tests/expected_outputs/identifyduplicatedfeatures (uma vez que ALGNAME = identifyduplicatedfeatures).

Conteúdo

3.1-Configurar Servidor
3.2-Gerenciar DBs de Servidor
3.3-Administração do Banco de Dados
3.4-Gerenciamento de Estilos
3.5-Permissões
3.6-Cobertura Terrrestre

4.1-Criar Banco de Dados
4.2-Criação de Bancos de Dados em Lote
4.3-Converter banco de dados

5.1-Carregar Camadas
5.2-Criar Moldura

6.1-Processos Edição
6.2-Processos Gestão de Camadas 6.3-Processos Geométricos
6.4-Definidor de Variáveis de Ambiente
6.5-Processos de Correção
6.6-Processos de Identificação
6.7-Processos de Manipulação
6.8-Processos de Rede
6.9-Processos Topológicos
6.10-Outros Processos
6.11-Qualidade de Dados

7.1-Ferramenta de feição customizada
7.2-Linha Cotadora
7.3-Visualizador de Codelist e Valores
7.4-Construir estruturas complexas
7.5-Seletor Genérico
7.6-Ferramenta de Inversão de Linhas
7.7-Ferramenta de Aquisição com Ângulos Retos
7.8-Ferramenta de Aquisição à Mão Livre
7.9-Ferramenta de Reshape à Mão Livre
7.10-Toggle Labels Visibility
7.11-Ferramenta de Área Mínima
7.12-Desenhar forma
7.13-Ferramenta de inspeção de feições
7.14-Inspecionar anterior
7.15-Inspecionar próximo
7.16-Ferramenta de Informações de Raster
7.17-DSGTools: Tooltip de Bandas
7.18-Visualização Dinâmica de Histograma
7.19-Definir Valor de Ponto

Apêndices

(DEV) Usando Git Hooks
(DEV) Suite de Testes de Algoritmos de Validação
(DEV) Criando links simbólicos
Changelogs

Licença

Licença Creative Commons
Esta obra está licenciada como uma Licença Creative Commons Atribuição-NãoComercial-Compartilha Igual 4.0 Internacional.

Clone this wiki locally