Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Есть два способа:Изображение и рендеринг.

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

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

Способ, основанный на рендеринге, работает при условии, что ваша библиотека 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% точнее, но требует гораздо больше усилий для написания кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top