Чему нас научил взаимный перенос тестов между Pii-Mask и его форком

Автор форка SuperB1aze/pii-mask-enhanced нашел и исправил несколько пропусков обработки Word и Excel в Pii-Mask. Вместе с исправлениями он добавил тесты. Я запустил их на нашей версии и получил 13 провалов. Так чужая работа дала нам список сценариев для разбора и помогла увидеть ошибки, которых не обнаруживали прежние проверки.
Хотелось перенести эти исправления и сохранить улучшения, появившиеся у нас после разделения веток. Поэтому сравнение сделал в обе стороны: Office-тесты автора форка запустил на нашей версии, а выбранные наши тесты - на форке.
Ниже покажу один найденный у нас пропуск, результаты сравнения и порядок проверки. Это разбор зафиксированных версий, на момент аудита перенос исправлений еще не был выполнен.
Фамилия после вложенной надписи
Один из тестов автора форка собирает минимальный искусственный OOXML-пакет с такой структурой. Здесь показан тестовый случай вложенности, без полной разметки настоящей надписи Word. ФИО искусственное:
<w:p>
<w:r><w:t>Договор. </w:t></w:r>
<w:r><w:pict><w:txbxContent>
<w:p><w:r><w:t>Приложение</w:t></w:r></w:p>
</w:txbxContent></w:pict></w:r>
<w:r><w:t>Директор Соколова Анна Владимировна</w:t></w:r>
</w:p>
Это фрагмент XML, не самостоятельный DOCX. В тесте он помещается в архив с остальными необходимыми частями документа.
Во внешнем абзаце есть надпись со своим вложенным абзацем. После нее идет ФИО. На проверенной нашей версии тест test_text_after_textbox_is_masked падает: фамилия остается в выходном XML. В форке он проходит.
Этот тест проверяет конкретное место в структуре файла. Обычный абзац с тем же ФИО мог маскироваться правильно. Причина искать дополнительные проверки здесь - вложенность документа, которую простой текстовый пример не воспроизводит.
В Office-исправлении форка есть и другие случаи: удаленный текст рецензирования, коды полей, адреса ссылок и авторы комментариев. Для Excel добавлены печатные колонтитулы и новые комментарии. Это полезные дополнения к нашему покрытию.
Как проверяли совместимость улучшений
Я зафиксировал коммиты и работал во временных копиях. В перенесенных тестах менял только импорты: пакет форка называется pii_mask_enhanced, наш - pii_mask. Утверждения и входные данные оставил прежними.
Проверка | Результат |
|---|---|
Собственный полный набор форка | 372 passed, 1 skipped |
Тесты DOCX/XLSX форка на нашей версии | 32 passed, 13 failed |
Наши тесты имен латиницей и технических терминов на нашей версии | 63 passed |
Те же 63 проверки на форке | 32 passed, 31 failed |
Числа относятся к разным наборам: 372, 45 и 63 проверки. Складывать их в общий процент качества нельзя. Полный собственный набор нашей версии в этом сравнении не запускался.
Тринадцать провалов указали на сценарии Office для отдельного разбора. В наборе есть проверки скрытия данных, сохранности остальных полей и отказа от неподдерживаемой обработки. Число провалов не равно числу утечек. Для разбора каждого случая уже есть тест автора форка.
В обратном направлении проверяли совместимость с нашими последующими изменениями. В проверенный форк не входили восемь коммитов, добавленных в нашем репозитории после разделения веток, в том числе исправления для имен латиницей и технических терминов в резюме. Поэтому 31 провал описывает различие версий. Причину каждого нужно проверять по истории изменений; приписывать эти результаты рефакторингу автора оснований нет.
Как повторить сравнение
Использованы наш репозиторий и форк. Проверены:
Наш Pii-Mask:
c2a03fc841be638898ae12b96b219f8b3aebe0ac.Форк:
bf4deafd437263f32041eb8f99bde2e76751f94d.
Порядок воспроизведения:
Клонировать оба репозитория в соседние каталоги
pii-maskиpii-mask-enhanced, выполнить в каждомgit checkoutс соответствующим SHA. Для сравнения использован Python 3.12. В каждом каталоге создать отдельное окружение черезpython3.12 -m venv .venvи установить зависимости:.venv/bin/python -m pip install -e ".[dev]".Из каталога форка запустить
.venv/bin/python -m pytest -q tests.Скопировать его
tests/test_docx.pyиtests/test_xlsx.pyв отдельный каталог проверок нашей копии. Заменитьfrom pii_mask_enhanced.formats import docx/xlsxнаfrom pii_mask import docx/xlsx, аfrom pii_mask_enhanced.engine.core import Masker- наfrom pii_mask.core import Masker. Импорты внутри тестовых функций тоже учитываются.Для отдельного каталога
fork_checksвнутри нашей копии команда такая:.venv/bin/python -m pytest -q fork_checks. Эти два файла используют собственные вспомогательные функции, stdlib и pytest; дополнительныхconftest.pyдля них не требуется.Скопировать наши
tests/test_latin_names.pyиtests/test_tech_terms.pyв отдельный каталог проверок форка. Заменить импорт наfrom pii_mask_enhanced.engine.core import Maskerи запустить из каталога форка.venv/bin/python -m pytest -q upstream_checks, если копии тестов лежат вupstream_checks. Для контрольного прогона в нашем репозитории:.venv/bin/python -m pytest -q tests/test_latin_names.py tests/test_tech_terms.py.
Перед запуском полезно проверить module.__file__ у импортируемых модулей: он должен указывать на выбранную копию. Иначе установленный пакет из другого каталога может незаметно подменить участника сравнения.
Что изменилось в нашем плане работы
Результатом аудита стал ранбук выборочного переноса Office-исправлений с сохранением наших последующих доработок. На момент сравнения перенос еще не был выполнен; рабочая установка не менялась.
Использовались искусственные примеры. При дополнительной проверке .doc-конвертера на Linux тест настоящего Microsoft Word был пропущен с причиной нет MS Word с pywin32. Прохождение этих тестов также не доказывает отсутствие данных во всех возможных частях Office-файла: изображения, вложенные объекты и другие каналы требуют своего покрытия.
Тесты автора форка дали нам готовые воспроизведения для Office-сценариев, которых не было в нашем наборе, а его исправления - материал для переноса. Сравнение с нашими последующими тестами помогло определить, какое поведение нужно сохранить при этой работе.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.