Teste automatizado de programas com saída gráfica

5
Sou professor de um módulo de pós-graduação em que espero que meus alunos escrevam código em Python que replique exemplos do livro didático. O projeto está sendo executado há alguns anos e este ano quero apresentar mais testes automatizados. O problema é escrever testes para as funções que produzem principalmente uma figura de matplotlib. Note que estamos apenas tentando replicar as figuras aproximadamente, então a comparação binária com uma imagem alvo não será muito útil.

A pergunta curta é: quais estratégias posso usar para testar programas cuja saída gráfica primária não pode ser comparada com uma imagem de referência estrita?

Alguns dos problemas que tenho com a base de código existente que impede o teste automatizado neste caso:

  • A produção do gráfico interrompe a execução em muitos casos
  • Não é prático gerar uma cópia da figura no livro que inclui anotações e assim por diante, portanto, a comparação algorítmica de imagens provavelmente não será a resposta.

Para esclarecer minhas metas:

  1. Eu gostaria de poder executar todo o código na base de código para verificar se está realmente em execução, mesmo que isso signifique jogar fora a saída. Isso pegaria regressões onde uma função é alterada
  2. Em vez de investir profundamente na correspondência fuzzy da saída gráfica com o destino, acredito que a verificação visual entre uma imagem de referência e a imagem gerada provavelmente será a mais simples, mas isso deve ser diferido a acontecer uma vez no final da corrida e não durante a execução
  3. Como esse é um projeto colaborativo, não preciso presumir que os alunos serão adversários. Os erros serão de boa fé e não perversos.
por chthonicdaemon 15.01.2014 / 08:50
fonte

2 respostas

3

Isso depende do contexto desses testes.

Em desenvolvimento, o teste geralmente é uma barreira contra negligência, apodrecimento de código ou mal-entendidos. O software fica muito complexo, mas normalmente pelo menos ele "luta justo": ele não tenta deliberadamente subverter suas intenções com resultados inúteis, mas passar no teste com um detalhe técnico.

Quando você lida com estudantes que estão programando para notas, essa é uma possibilidade real. Portanto, o equilíbrio de pressões se desloca sutilmente contra testes automatizados, particularmente quando a exigência não é uma propriedade matemática rígida e rápida, mas algo tão vago quanto "replique essa figura aproximadamente". Obviamente, existem várias aproximações do critério de objetivo que você pode usar e que podem ser úteis (contar o número de pixels pretos e brancos, detectar arestas e comparar sua estrutura, realizar uma transformação de Fourier completa e julgar a similaridade no espaço de freqüência nos próprios pixels ...)

No entanto, pode ser que olhar os resultados com olhos humanos e classificá-los manualmente seja realmente mais eficiente. Pense nisso como explorando a incrível aceleração de hardware que o cérebro humano fornece para o reconhecimento de padrões.

    
por 15.01.2014 / 09:17
fonte
0

Se o resultado não puder corresponder perfeitamente ao original, você terá que fazer algumas correspondências parciais.

Uma medida muito simples seria usar a imagem original como padrão de ouro. Subtraia seu próprio resultado (usando a diferença absoluta como resultado), e talvez a média em toda a imagem. Isso deve lhe dar uma ideia de como, pelo menos, a forma das coisas se encaixa no original.

Um ajuste nesse método seria redimensionar ambas as imagens até que seus tamanhos correspondam. Outra seria redimensionar ambos para um tamanho muito menor e compará-los com muito mais rigor, para se ajustar apenas à estrutura geral do original.

Também gostaria de destacar a ideia do @ KilianFoth de usar outros espaços de fase, mas tenha muito cuidado ao comparar maçãs e laranjas em tais casos, ignorando, por exemplo, dados de baixa frequência ("ruído").

Como uma dica geral, você tem para ter algo e os resultados podem ser comparados se você quiser testá-lo. Não importa o que seja - uma descrição de texto, uma função ou uma imagem - você tem que usar isso como meta para o teste.

    
por 15.01.2014 / 09:14
fonte