Como testar algo renderizado corretamente?
-
20-09-2019 - |
Pergunta
Como um teste se um aplicativo renderizou algo corretamente?
Por exemplo (exemplo 2D):
Microsoft Word 2007 http://img32.imageshack.us/img32/6197/37841144.png
Como se sabe que a sombra é colocada corretamente ou a cor / contorno correto foi renderizado? Ou se o efeito 3D se renderize corretamente quando alguém giraria em uma direção? Outras coisas poderiam ser se a palavra arte fosse redimensionada, como alguém mede sua 'correção'?
Solução
Existem algumas maneiras:
- Se for realmente especificado com muita precisão o que deve ser renderizado e exatamente de que maneira, basta comparar os pixels com uma renderização de referência.
- No caso de coisas como SVG, não é tão claramente especificado. A abordagem usual aqui é usar renderizações de referência e compará -las manualmente. Você pode facilmente sobrepor os dois, subtrair um do outro e o ponto gritante de diferenças dessa maneira. Não é um processo automático, no entanto.
- Você pode olhar para os dados que representam a imagem desenhada em vez da imagem diretamente na tela. O que é desenhado é (no seu exemplo) um gráfico vetorial. Isso significa que existem várias formas que devem ter propriedades, formas e cores bem definidas e você pode simplesmente comparar seus dados de forma com uma referência. Esse tipo de coisa pode ser feita automaticamente. Acho que o Google usa uma abordagem semelhante para comparar a renderização do Chrome com as renderizações de referência das páginas da web; Eles não comparam os dados do pixel, comparam os dados de nível superior e como o navegador gostaria renderizar.
Outras dicas
Existem duas maneiras: a imagem e a renderização baseadas em uma.
A maneira da imagem: você deve encontrar uma maneira de renderizar a imagem a um buffer de pixels interno (para que você possa executar seus testes "sem cabeça", ou seja, sem uma interface do usuário real aparecendo).
Em seguida, selecione alguns pixels e verifique se suas cores estão corretas. No seu exemplo, selecione alguns pixels brancos ao redor do texto para garantir que a renderização não vaze. Métodos auxiliares como assertThatRectangleIs(area, color)
ajudará a cobrir um terreno. A idéia é selecionar áreas específicas (como a barra vertical esquerda do H) e não ser muito exigente.
A maneira baseada em renderização funciona com a suposição de que sua biblioteca GFX funciona. Então, o que você faz é zombar do código de renderização real com algo assim:
public class MockGC extends GC {
List<Op> ops = new ArrayList<Op> ();
void drawLine (int x1, int y1, int x2, int y2) {
ops.add(new Line(x1, y1, x2, y2, copyGC (gc)));
}
}
Então, basta salvar o comando e todas as opções relevantes em uma estrutura de dados fácil de comparar. Ou até:
public class MockGC extends GC {
StringBuilder buffer = new StringBuilder ();
void drawLine (int x1, int y1, int x2, int y2) {
buffer.append("line "+x1+","+y1+" - "+x2+","+y2+", color="+foreground()+"\n");
}
}
Mais tarde, você pode apenas verificar se os comandos de renderização corretos foram emitidos e se o GC (cores, fonte, dicas de renderização) foi usado.
A última maneira é muito mais rápida e 100% precisa, mas muito mais trabalha para codificar.