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'?

Foi útil?

Solução

Existem algumas maneiras:

  1. 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.
  2. 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.
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top