Как проверить, что что-то отображается правильно?
-
20-09-2019 - |
Вопрос
Как проверить, правильно ли приложение что-то отобразило?
Например (пример 2D):
Microsoft Word 2007 http://img32.imageshack.us/img32/6197/37841144.png
Как узнать, что тень размещена правильно или отрисован правильный цвет/контур?Или правильно ли отображается 3D-эффект при вращении в определенном направлении?Другие вещи могли бы заключаться в том, что если бы слово «искусство» было изменено в размерах, как можно измерить его «правильность»?
Решение
Есть несколько способов:
- Если на самом деле очень точно указано, что и каким именно образом следует визуализировать, то вы можете просто сравнить пиксели с эталонным рендерингом.
- В случае с SVG это не так четко указано.Обычный подход здесь — использовать эталонные изображения и сравнивать их вручную.Вы можете легко наложить оба, вычесть одно из другого и таким образом обнаружить явные различия.Однако это не автоматический процесс.
- Вы можете просмотреть данные, представляющие нарисованное изображение, а не изображение непосредственно на экране.Рисуется (в вашем примере) векторная графика.Это означает, что существует несколько фигур, которые должны иметь четко определенные свойства, формы и цвета, и вы можете просто сравнить данные фигуры с эталоном.Такие вещи можно делать автоматически.Я думаю, что 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% точнее, но требует гораздо больше усилий для написания кода.