2017-02-21 42 views
0

Мне нужно проверить содержимое zip-файлов, сгенерированных приложением python. Я ожидаю, что каждый раз, когда мы запускаем приложение, он генерирует точно такой же ZIP-файл с тем же содержимым (при предоставлении одного и того же ввода). По содержанию я имею в виду только содержимое сжатых файлов, а не метаинформацию этих файлов или zip-файлов.Проверка zip-файлов в python

Проблема заключается в том, что zip-файлы сохраняют некоторую метаинформацию, такую ​​как время создания каждого файла, которые различаются при каждом запуске приложения. К сожалению, эти zip-файлы могут содержать миллионы небольших файлов, из-за чего очень неприятно извлекать и вычислять значение хэша для каждого небольшого файла.

Каковы хорошие способы проведения такого теста? Я пытался использовать метод «md5» из hashlib, то есть сравнивая значение md5 zip-файла с ранее вычисленным значением. Однако значение md5 отличается при каждом запуске приложения, потому что метаинформация отличается. Любая идея, как я могу сделать этот тест? Я не возражаю, чтобы извлечь и повторно закрепить его, используя, по возможности, одну и ту же метаинформацию. Обратите внимание, что zip-файлы содержат несколько слоев каталогов.

+0

Вы хотите проверить один zip-файл с другим zip-файлом, используя md5 или содержимое? –

+0

@ v.coder Я пишу модуль тестирования для приложения, ожидая каждый раз, когда приложение генерирует zip-файл с таким же содержимым. – Luke

+0

, так что вы проверяете содержимое zip-файла? –

ответ

1

Мне нравится базовая идея Лоран S, чтобы убедиться, что у вас есть те же самые условия, когда вы запускаете тесты. Пока вы не считаете проблему безопасности проблемой, я бы согласился на использование md5.

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

zip t1 t00*png 
zip t2 t00*png 

Теперь некоторые мета- изменение:

touch t00*.png 
zip t3 t00*png 

Результат:

md5sum *.zip 
760a4a1c52f3bc6cdd29c1fff7b94c1f t1.zip 
760a4a1c52f3bc6cdd29c1fff7b94c1f t2.zip 
83a8dcb9fe0d50e7b2b8012c8842005e t3.zip 

Это означает, что - наконец мою версию молнии [1] не делает производить повторяемые содержание, пока нет метаданные изменены.

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

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

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

Доказательство концепции:

touch t00*.png -d '2000-01-01T0:00' 
zip t1 t00*png 
touch t00*.png -d 
zip t2 t00*png 
touch t00*.png -d '2000-01-01T0:00' 
zip t3 t00*png 

Результат:

md5sum *.zip 
a1e713c1d91a0042b37043c83bb98d1b t1.zip 
3085aa53bee69df4be783636b87ed62c t2.zip 
a1e713c1d91a0042b37043c83bb98d1b t3.zip 

Последнее, но не менее вы можете попытаться настроить эти области вашего файла ZIP-, которые не относятся к тесту. Как ZIP кажется хорошо формат Behaving контейнера метаданные моих изменений отображаются в аккуратных расстояниях - закалка моего предположения, что они являются заголовками/колонтитулами в файл:

cat t1.zip| xxd -ps -c 20 > t1.hd 
cat t2.zip| xxd -ps -c 20 > t2.hd 
diff t1.hd t2.hd 
1c1 
< 504b03041400000008000000212822aad7cacc0b 
--- 
> 504b0304140000000800c37a574a22aad7cacc0b 
3c3 
< 09000370356d3870356d3875780b000104e80300 
--- 
> 0900030df0ae580df0ae5875780b000104e80300 
3432c3432 
< 6082504b030414000000080000002128143698a4 
--- 
> 6082504b0304140000000800c37a574a143698a4 
3434c3434 
< 555409000370356d3870356d3875780b000104e8 
--- 
> 55540900030df0ae580df0ae5875780b000104e8 
19691,19693c19691,19693 
... 

Обратите внимание, что, очевидно, минимальные различия, обусловленные метаданными - изменение.

[1] Linux 4.9.9-1-ARCH #1 SMP PREEMPT Thu Feb 9 19:07:09 CET 2017 x86_64 GNU/Linux, <br> 
Zip 3.0 (July 5th 2008), by Info-ZIP, Compiled with gcc 5.3.0 for Unix (Linux ELF) on Jan 12 2016. 
+0

Я подтвердил, что это работает для файлов в одном каталоге. Но у меня возникают проблемы с тем, что он работает с файлами с многоуровневыми каталогами. Я использую команду: find TestDir -exec touch -d '2000-01-01T0: 00' {} \; Я уверен, что нет других скрытых файлов, кроме «.». и ".." внутри каталогов. Вы знаете, что я пропустил здесь? Большое спасибо. – Luke

+0

Я могу подтвердить некоторую нестабильность, используя поддиры. Первое предположение будет случайным, когда файлы будут добавлены. Вы используете zip с помощью подстановочных знаков? Не могли бы вы попробовать и закрепить несколько файлов «вручную», имея в виду, что каждый из них является отдельным параметром? – RuDevel

1

Насколько я понимаю, вы пытаетесь написать автоматизированные тесты для проверки содержимого вашего zip-файла, что вы ожидаете.

md5 кажется хорошим кандидатом на это. Теперь, если у вас есть данные, связанные с временем в zip-файле, я бы предложил использовать для этого https://github.com/spulec/freezegun. Он предназначен для «приостановки» времени, так что все вызовы функций datetime (now(), today() ...) возвращают знаковое значение. Вы могли бы сделать что-то вроде:

from freezegun import freeze_time 

def test_zipping(): 
    with freeze_time("2012-01-14 12:34:56"): 
     zipfile = create_zip_file(data) 
     md5 = hashlib.md5() 
     with open(zipfile_name) , "rb") as f: 
      data = f.read(block_size) 
      if not data: 
       break 
      md5.update(data) 
     assert md5.digest() == expected_md5_value 

С этим, вы должны быть в состоянии вывезти хаотичность связанного времени звонков от ваших тестов.

(вдохновленный Get MD5 hash of big files in Python, так как ваш почтовый файл кажется достаточно большим)

+0

Спасибо @Laurent S. Содержимое zip-файла не связано с временем, именно при создании zip-файла он записывает некоторую метку времени в метаинформацию zip-файла. Но я попробую ваше предложение, посмотрю, задержит ли он время для zip-модуля. – Luke

+0

Нет, это не работает для меня. Я извлекаю zip-файлы, а затем zip их с помощью shutil.make_archive(). Значение md5 по-прежнему отличается от run to run. – Luke

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^