Как проверить что-то правильно отображается? - PullRequest
1 голос
/ 16 ноября 2009

Как можно проверить, правильно ли приложение что-то отобразило?

Например (2D пример):

Microsoft Word 2007 http://img32.imageshack.us/img32/6197/37841144.png

Как узнать, что тень была правильно размещена или был отображен правильный цвет / контур? Или, если 3D-эффект рендерится правильно, если повернуть в каком-либо направлении? Другие вещи могли бы быть, если бы слово искусство было изменено, как можно измерить его «правильность»?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2009

Есть несколько способов:

  1. Если на самом деле очень точно указано, что должно быть отображено и каким именно образом, то вы можете просто сравнить пиксели с эталонным рендерингом.
  2. В случае таких вещей, как SVG, это не так четко указано. Обычный подход здесь состоит в том, чтобы использовать отрисовки ссылок и сравнивать их вручную. Вы можете легко наложить оба, вычесть одно из другого и таким образом заметить явные различия. Хотя это не автоматический процесс.
  3. Вы можете просматривать данные, представляющие нарисованное изображение, а не изображение непосредственно на экране. То, что рисуется, - это (в вашем примере) векторная графика. Это означает, что есть несколько фигур, которые должны иметь четко определенные свойства, формы и цвета, и вы можете просто сравнить свои данные формы со ссылкой. Такого рода вещи могут быть сделаны автоматически. Я думаю, что Google использует аналогичный подход для сравнения рендеринга Chrome со ссылками на веб-страницы; они не сравнивают данные пикселей, они сравнивают данные более высокого уровня, что и как браузер будет отображать.
2 голосов
/ 16 ноября 2009

Существует два способа: изображение и рендеринг.

Способ изображения: вы должны найти способ визуализации изображения во внутренний пиксельный буфер (чтобы вы могли запускать свои тесты «без головы», т. Е. Без фактического всплывающего интерфейса).

Затем выберите несколько пикселей и убедитесь, что их цвета правильные. В вашем примере выделите пару белых пикселей вокруг текста, чтобы убедиться, что рендеринг не протекает. Вспомогательные методы, такие как assertThatRectangleIs(area, color), помогут покрыть некоторую землю. Идея состоит в том, чтобы выбрать определенные области (например, левую вертикальную полосу Н) и не быть слишком требовательным.

Способ, основанный на рендеринге, работает при условии, что ваша библиотека gfx работает. Итак, что вы делаете, вы высмеиваете реальный код рендеринга примерно так:

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)));
    }
}

, поэтому вы просто сохраняете команду и все соответствующие параметры в структуре данных, которую легко сравнивать. Или даже:

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");
    }
}

Позже вы можете просто проверить, что были введены правильные команды рендеринга и что использовался GC (цвета, шрифт, подсказки рендеринга).

Последний способ намного быстрее и точнее на 100%, но требует гораздо больше работы для кодирования.

...