Нужна помощь в понимании разницы в необработанных двоичных данных изображения для теста PHPUnit - PullRequest
2 голосов
/ 22 августа 2011

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

Чтобы привести пример, вот результат одного из моих тестов (обратите внимание, я сравниваю двоичные данные изображений в виде строки):

ImageTest :: testAutoCrop

Не удалось утверждать, что две строки равны.

--- Ожидается

+++ Actual

@@ @@

? П ?? м?

-? F sO = f ?????????? ^ ??????? w ??>

                          ?(???/o????M)???o%tEXt??%tEXt

+? F sO = f ?????????? ^ ??????? w ??>

                          ?(???/o????M)???o%tEXt

Как вы можете видеть ... единственное различие между этими двумя файлами состоит в том, что ожидаемое изображение содержит следующую дополнительную строку: "?% TEXt".

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

Спасибо

Malcolm

PS: Пожалуйста, дайте мне знать, если мне нужно предоставить больше информации.

Ответы [ 2 ]

2 голосов
/ 08 августа 2012

Итак, я в конце концов нашел решение этой проблемы. Пара вещей, чтобы уточнить:

  1. Причина, по которой я делал модульные тесты, заключается в том, что наше веб-приложение imageservice (PHP) использует Imagemagick для обработки всех изображений, манипуляций, преобразования HTML в изображение и PDF в изображение (jpg, png, gif, все конверсии не в формате cmyk, pdf), которые происходят на нашем основном веб-сайте. Нужно было убедиться, что когда мы добавили новые функции в это приложение-службу изображений, было достаточно тестов, чтобы убедиться, что все по-прежнему функционирует правильно.

  2. Строковые данные, которые мы видели на каждом изображении (aka:?% TEXt), являются exif-данными изображения. (http://en.wikipedia.org/wiki/Exchangeable_image_file_format), чтобы сравнить фотографии (предложение взято из ответа Дэвида Андерссона (https://stackoverflow.com/users/904933/david-andersson), нам нужно было полностью удалить все комментарии с изображения вместе с отметкой времени создания даты / изменено на информация. Таким образом, вы имеете дело просто с изображением, а не с метаданными другого типа. Мы сделали это с помощью следующей функции:


protected static function _removeTimeStamp( $string, $pdf = false ) {

  /* Note: Assume $string parameter is the image you're planning on cleaning in string format. */

  /* If you're working with a pdf, you need to remove the CreationDate using regex from the string representation. */
  if ( $pdf )
    return preg_replace( '/(CreationDate[^)]+)/', '', $string );

  /* Create a path for the temporary image we're going to need to create that will hold the exif free image */
  $strip_tmp = 'test/strip_tmp';

  /* write contents of string to temp string file */
  file_put_contents( $strip_tmp, $string );

  /* this will remove all exif data along with the date:create and date:modify properties from the image */
  exec( 'convert ' . $strip_tmp . ' -strip +set date:create +set date:modify ' . $strip_tmp . ' 2> /dev/null' ); 

  /* get the string representation of the new "cleaned" image */
  $result = file_get_contents( $strip_tmp ); 

  /* delete the temp file */
  unlink( $strip_tmp ); 

  /* return the cleaned string */
  return $result;

} // _removeTimeStamp

Это было выполнено на каждом изображении перед сравнением их друг с другом (в формате String). Надеюсь, в будущем это поможет кому-то, кто может делать что-то подобное.

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

1 голос
/ 22 августа 2011

В модульных тестах вы должны тестировать только свои юниты, а не сторонние коды.

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

Таким образом, вопрос будет: двоичные данные, генерируемые вашим кодом, вашими единицами измерения? Я думаю, нет, иначе вы бы знали, почему двоичные данные отличаются.

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

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

...