Тестирование генерации графики с JUnit - PullRequest
8 голосов
/ 04 августа 2010

Я использую Java Graphics2D для генерации графического представления графа.Я также использую ImageIO для записи файла PNG.(ImageIO.write(image, "png", out);)

Мне интересно, как мне писать тесты JUnit, чтобы проверить, является ли сгенерированная графика ожидаемой.Я мог бы предварительно сгенерировать файлы PNG, но что, если шрифт немного отличается на другом компьютере?

Ответы [ 4 ]

2 голосов
/ 23 июня 2014

Мне кажется, что эта конкретная реализация работает:

private void compareRasterImages(BufferedImage expectedPngIo, BufferedImage actualPngIo) throws AssertionError {
    int minX = expectedPngIo.getMinX();
    int minY = expectedPngIo.getMinY();
    int maxX = expectedPngIo.getMinX() + expectedPngIo.getWidth();
    int maxY = expectedPngIo.getMinY()+ expectedPngIo.getHeight();

    assertEquals(minX, actualPngIo.getMinX()); 
    assertEquals(minY, actualPngIo.getMinY()); 
    assertEquals(expectedPngIo.getHeight(), actualPngIo.getHeight()); 
    assertEquals(expectedPngIo.getWidth(), actualPngIo.getWidth()); 
    for (int x_i = minX; x_i < maxX; x_i++){
        for (int y_i = minY; y_i < maxY; y_i++) {
            assertEquals(expectedPngIo.getRGB(x_i, y_i), actualPngIo.getRGB(x_i, y_i));
        }
    }
}

Я извлекаю BufferedImage из моего PNG (как байт []), используя ImageIO:

BufferedImage expectedPngIo = ImageIO.read(new ByteArrayInputStream(expectedPng));
enter code here
1 голос
/ 19 ноября 2016

Я считаю, что это эффективно для создания одинаковых кроссплатформенных отрисованных шрифтов для тестовых графических модульных тестов простых вещей, таких как текст, наложенный на статическое изображение.

  1. Внедрите Font и FontRenderContext в класс, отрисовывающий шрифты, чтобы ими можно было управлять при тестировании.
  2. Введите файл .ttf для модульного теста и используйте Font.createFont() для создания шрифта из файла.
  3. В модульном тесте отключите сглаживание в FontRenderContext. Если вы пропустите этот шаг, результаты могут отличаться для разных платформ.

Мне любопытно, если другие считают, что это по какой-то причине хрупко или склонно к сбоям, но у меня до сих пор были хорошие результаты.

1 голос
/ 04 августа 2010

Вы можете прочитать все значения RGB сгенерированных изображений в массив и сравнить этот 2D-массив с массивом, представляющим предварительно сгенерированное изображение, если вы действительно конкретны в отношении полного изображения.

Если вы хотите игнорировать шрифты, вы можете сделать то же самое для области изображения, которая не содержит переменных данных, в зависимости от среды, в которой генерируются изображения. Встраивание процедур коррекции и нормализации для модульных тестов было бы пустой тратой времени, если только приложение не должно генерировать изображения с такой высокой точностью, которая гарантирована.

1 голос
/ 04 августа 2010

Вы можете попробовать протестировать определенные, известные функции вывода, например:

.
  • Это там белый пиксель при (100,100)?
  • Это граница полностью черная?
  • Является ли изображение ожидаемым размером?

И / или вы можете написать тесты для некоторых «агрегатных свойств», которые допускают некоторую неопределенность в результатах:

  • Соответствует ли изображение хотя бы на 90% контрольному изображению? (для учета разных шрифтов, различий сглаживания и т. д.)
  • Является ли наиболее распространенный цвет на изображении цветом фона?
...