Skip to Content

Fcomp. Утилита для сравнения файлов

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

Безусловно, fcomp – очередной «велосипед» на тему сравнения файлов, потому как ничего сверхъестественного он не делает. «Изобретен» сей «велосипед» был достаточно давно, и, успешно выполнив свою задачу, долгое время пылился в закоулках моего винчестера. Но не так давно для него снова нашлась задача, что и подтолкнуло меня к мысли о том, что утилита не настолько бесполезна как казалось, после чего и было решено поделится ей с общественностью.

Что же такого особенного в fcomp'e, что заставило меня написать свою утилиту вместо того, чтобы использовать одну из многих доступных в сети? А вот что. В отличии от десятков других утилит (не могу сказать, что от всех, возможно, я плохо искал) fcomp умеет сохранять копии файлов с которыми впоследствии и будут сравниваться измененные файлы. Звучит слегка запутанно, не правда ли? Думаю, что лучше объяснить на примере.

Допустим, у вас есть несколько файлов расположенных на винчестере приблизительно вот так:

С:\myprogram\superservice\today\log.txt
D:\myprogram\megafeature\workingfolder\pupkin\vasja.dat

...
(много файлов)

...
Z:\myprogram\strangefolder\temp\... (здесь много файлов)

Вы хотите произвести некоторые действия в некотором приложении и после этого проверить изменились ли эти файлы и что именно в них изменилось. Более того, вы хотите проделать эту процедуру не единожды, а два-три десятка раз. Что будете делать? Копировать каждый раз все файлы, выполнять действия в программе, сравнивать файлы - копировать файлы, выполнять действия в программе, сравнивать - копировать, выполнять... Вы правда хотите копировать все эти файлы вручную по 100500 раз, а потом снова и снова натравливать на них утилиту для их сравнения? Нет, вам, конечно же, никто не запрещает этого делать, но, если вы хотите сэкономить свое время, то попробуйте воспользоваться fcomp'ом, т.к. все операции по копированию и сравнению он возьмет на себя, вам лишь останется указать ему какие файлы вас интересуют, а в дальнейшем периодически нажимать на парочку клавиш и рассматривать отчеты.

Итак, как же пользоваться fcomp'ом? Очень просто. Для этого нужно составить список путей к файлам или папкам, которые вы хотите сравнивать, и поместить его в файл nodes.txt, находящийся в папке с программой. Каждый из путей должен быть записан с новой строки, т.е. список должен выглядеть следующим образом:


C:\file1.log
C:\folder1
D:\file2.txt
E:\folder2

В самом простом случае — если вас интересуют лишь имена измененных файлов, но не интересуют изменения в их содержимом, и вы хотите сравнить абсолютно все файлы из папок указанных в nodes.txt, вы можете смело запускать fcomp. Если же, вам все-таки необходимо проследить за изменениями в содержимом, либо отфильтровать некоторые файлы, то вам придется слегка подправить файл config.ini, который содержит следующие опции:

Секция [RegexPath]
Эта секция позволяет отфильтровать файлы, которые будут участвовать в сравнении, при помощи регулярных выражений. Настроить фильтрацию можно при помощи следующих опций:

regex_mode
none – все файлы будут участвовать в сравнении (по умолчанию)
search – файл, у которого хотя бы часть пути совпадает с регулярным выражением, будет включен в процедуру сравнения, либо исключен из нее (зависит от опции regex_act)
match – файл, путь которого полностью совпадает с регулярным выражением будет включен в процедуру сравнения, либо исключен из нее (зависит от опции regex_act)

regex_act
include – только файлы, пути к которым совпадают с регулярными выражениями, будут включены в сравнение (по умолчанию)
exclude – файлы,  пути к которым совпадают с регулярными выражениями, не будут включены в сравнение

Если опция regex_mode включена, то в эту секцию необходимо добавить регулярные выражения с которыми и будут сравниваться пути к файлам. Выглядеть это должно следующим образом:
<имя>=<регулярное выражение>
<имя> может выглядеть как угодно, например, SuperPuperRegex вполне подойдет. Количество регулярных выражений не ограничено.

Секция [RegexDiff]
Эта секция позволяет определить файлы, содержимое которых будет сравниваться.

regex_mode
none – содержимое файлов сравниваться не будет (по умолчанию)
search или match – по аналогии с предыдущей секцией
Так же как и в случае с предыдущей секцией, при включении опции  regex_mode необходимо будет добавить желаемые регулярные выражения.

Пример.
Если вы хотите сравнить файлы с расширениями .cfg, .ini, .nfo, .log, а также сравнить содержимое файлов .nfo и .log, то config.ini будет выглядеть вот так:

[RegexPath]
regex_mode = search
regex_act = include
cfg_files = .cfg
ini_files = .ini
nfo_files = .nfo
log_files = .log
[RegexDiff]
regex_mode = search
nfo_files = .nfo
log_files = .log

 

После того, как config.ini будет отредактирован, можно запускать fcomp и жать на одну из клавиш:
r — копирует файлы в репозиторий
с — сравнивает файлы из nodes.txt с файлами в репозитории и генерирует HTML отчет (по умолчанию находится в папке repo/diff/_report)
n – перечитывает файл nodes.txt

Вот, вроде бы, и все что нужно знать для того чтобы успешно пользоваться fcomp'ом. Саму утилиту можно найти на GitHub'е. Для ее запуска достаточно выполнить в командной строке:

python fcomp.py

Работает утилита как под Windows, так и под Linux (правда здесь не исключены проблемы, на моей Kubuntu ее поведение без sudo слегка неадекватно Smile). Ленивые пользователи Windows могут воспользоваться сборкой находящейся в папке dist.

На этом все. Надеюсь, что утилита вам пригодится.

З.Ы. Можно постить баги и пожелания (if any).
З.З.Ы. За качество кода просьба не пинать, не для того оно писалось Smile

----------

Отправить комментарий

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Pairs of<blockquote> tags will be styled as a block that indicates a quotation.
  • Textual smileys will be replaced with graphical ones.

Подробнее о форматировании