Skip to content

Рефакторинг: тесты, устранение дублирования, логирование - #16

Merged
Segate-ekb merged 9 commits into
vanessa-opensource:mainfrom
Segate-ekb:refactoring/tests-dedup-logging
Aug 31, 2026
Merged

Segate-ekb merged 9 commits into
vanessa-opensource:mainfrom
Segate-ekb:refactoring/tests-dedup-logging

Conversation

@Segate-ekb

Copy link
Copy Markdown

Цель

Масштабный рефакторинг библиотеки с сохранением обратной совместимости публичного API: покрытие тестами, устранение дублирования, подробное логирование и информативные сообщения об ошибках.

Обратная совместимость

Сигнатуры и семантика всех экспортных методов сохранены (кроме изменений, уже внесённых в апстриме в #15). Подтверждено прогоном интеграционных тестов на платформе 8.3.27.1859 до и после рефакторинга: результаты идентичны (27 пройдено / 1 падение ТестДолжен_ОбновитьКонфигурациюДинамически, существовавшее до рефакторинга).

Историческое поведение неявных проверок версии вида Если СравнитьВерсии(Версия, "8.3.20") Тогда (истина при версии ≠ 8.3.20, включая более старые) сознательно сохранено и сделано явным (<> 0) с поясняющими комментариями — вероятно, имелось в виду > 0, но это отдельное решение мейнтейнеров.

Тесты (38 новых, не требуют создания баз)

  • common_functions_tests.os — 15 тестов служебного модуля (сравнение версий, кавычки, конверсии yes/no и true/false, проверка имён 1С, шаблоны переменных среды);
  • configfile_as_tests.os — 12 характеризационных тестов генератора YAML: фиксируют точное содержимое всех секций конфигурационного файла автономного сервера;
  • ibcmdrunner_unit_tests.os — 9 тестов УправлениеИБ без создания баз (версия, путь, разбор списка расширений по фиксированному тексту, исключения при некорректных параметрах);
  • ibsrvrunner_tests.os — починен вызов несуществующего метода УстановитьВерсию (класс всегда предоставлял только УстановитьВерсиюПлатформы), тест падал;
  • ibcmdrunner-test.os — вызов ИзменитьСвойстваРасширения приведён к новому интерфейсу из Добавлена возможность выборочной установки свойств расширения #15 (имя профиля безопасности — строка), тест падал на проверке типа.

Рефакторинг

  • Новый общий модуль СлужебныйIbcmdRunner — единая реализация функций, дублировавшихся в трёх классах: СравнитьВерсии, ОбернутьВКавычки, конверсии Булево↔yes/no и Булево→true/false, ЯвляетсяИменем, ШаблонПеременнойСреды, ИмяЛога.
  • УправлениеИБ: четыре метода СоздатьИБ* сведены к одному шаблонному (ПодготовитьКомандуСозданияИБ); guard-проверки версии платформы и имён вынесены в ПроверитьМинимальнуюВерсиюПлатформы/ПроверитьИмя; трижды повторявшийся блок --archive/--server/--threads — в ДобавитьПараметрыФоновойВыгрузки; секретные параметры (логин/пароль через переменные среды) — в ДобавитьСекретныйПараметр; разбор вывода extension list выделен в тестируемый метод РазобратьСписокРасширений.
  • КонфигурационныйФайлАС: ручная построчная запись YAML заменена сборкой структуры данных (вложенные Соответствия/Массивы) и сериализацией библиотекой oscript-yaml (ПарсерYaml.ЗаписатьВФайл). Экранирование значений (пути с \, строки с :) гарантирует сериализатор; номера портов записываются числами (ранее XMLСтрока превращала их в строки). Тесты генератора — семантические: файл разбирается обратно ПрочитатьИзФайла и проверяется структура.
  • УправлениеАС: проверка порта вынесена в общую процедуру, общие функции — в модуль.

Логирование

Подробный отладочный лог (oscript.lib.ibcmdrunner, раздел добавлен в Readme):

  • командные строки запуска ibcmd/ibsrv, длительность и код возврата каждой команды;
  • установка каждого параметра; ход ожидания готовности автономного сервера;
  • пароли в лог не попадают — логируются только имена переменных среды;
  • информационные сообщения для операций, меняющих состояние ИБ.

Сообщения об ошибках дополнены контекстом (исходный текст сохранён как префикс/часть сообщения — проверки по подстроке продолжают работать): команда и код возврата с ожидавшимися кодами; текущая и требуемая версия платформы; фактическое некорректное значение параметра; пути несуществующих каталогов/файлов; файл готовности и время ожидания при неудачном запуске ibsrv (префикс Процесс ibsrv не запустился! сохранён для ЭтоИсключенияЗапускаАС).

Исправленные ошибки (КонфигурационныйФайлАС)

  1. Опечатка Вставмит — крах ПараметрыВеб_ПубликацияOData при передаче параметров повторного использования сеансов.
  2. ДобавитьПараметрыХТТПСервиса добавлял сервис в массив веб-сервисов — http-сервисы публиковались в чужой подсекции.
  3. Секция application (ПараметрыВеб_Приложение) вообще не записывалась в файл.
  4. Рассинхрон ключей allow-standart/allow-standard: запрет стандартной аутентификации никогда не записывался.
  5. Рассинхрон reuse-sessions/reuse-session: параметры сеансов OData никогда не записывались.
  6. Все элементы массива разделителей ссылались на одно соответствие и получали значения последнего добавленного разделителя.
  7. Массивы разделителей/сервисов инициализировались как Соответствие — вызов Добавить* с флагом «не первый» падал.
  8. Незаполненные (Неопределено) параметры роняли запись секции — теперь пропускаются (сервер использует значения по умолчанию).
  9. УправлениеИБ.РазобратьСписокРасширений устойчив к строкам свойств без значения (раньше — выход за границы массива).

Все исправления зафиксированы характеризационными тестами.

На заметку мейнтейнерам

  • Ключ shedule-jobs в секции infobase похож на опечатку (schedule-jobs?) — поведение сохранено, не менял.
  • Версия пакета поднята до 0.4.0 (новый модуль в lib.config, зависимость oscript-yaml, исправления поведения генератора YAML).
  • Требуемая версия среды поднята до 2.0.0 — этого требует oscript-yaml.
  • В oscript-yaml 0.3.0 обнаружен баг десериализатора (не влияет на создаваемые файлы): в double-quoted строках эскейп \b обрабатывается раньше \\, поэтому "d:\\bases" разбирается как d:<BS>ases (Десериализатор.os, строки 636–647 — цепочка СтрЗаменить). Тест пути с обратными слэшами из-за этого проверяет текст файла, а не round-trip.

🤖 Generated with Claude Code

Segate-ekb and others added 9 commits August 31, 2026 19:34
- Новый модуль СлужебныйIbcmdRunner: общие функции трёх классов
  (сравнение версий, кавычки, yes/no-конверсии, проверка имён 1С,
  шаблоны переменных среды) — устранено дублирование между классами.
- УправлениеИБ: выделены повторяющиеся блоки (проверка минимальной
  версии платформы, подготовка команды создания ИБ, параметры фоновой
  выгрузки, добавление массивов параметров, секретные параметры).
- Подробное отладочное логирование всех операций: командная строка,
  длительность, код возврата; значения паролей в лог не попадают.
- Сообщения об ошибках дополнены контекстом: команда, код возврата,
  ожидавшиеся коды, текущая версия платформы, подсказки по исправлению.
- Разбор списка расширений выделен в тестируемый метод
  РазобратьСписокРасширений и устойчив к свойствам без значений.
- Неявные проверки версии вида 'Если СравнитьВерсии(...) Тогда'
  заменены на явные '<> 0' с сохранением исторического поведения.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Исправленные ошибки:
- опечатка 'Вставмит' роняла ПараметрыВеб_ПубликацияOData при передаче
  параметров повторного использования сеансов;
- параметры http-сервисов добавлялись в массив веб-сервисов и
  публиковались в чужой подсекции;
- секция application (ПараметрыВеб_Приложение) вообще не записывалась
  в конфигурационный файл;
- рассинхрон ключей: 'allow-standart'/'allow-standard' — запрет
  стандартной аутентификации никогда не записывался;
  'reuse-sessions'/'reuse-session' — параметры сеансов OData
  никогда не записывались;
- все элементы массива разделителей ссылались на одно соответствие
  и получали значения последнего добавленного разделителя;
- массивы разделителей и сервисов инициализировались как Соответствие;
- незаполненные параметры (Неопределено) роняли запись секции —
  теперь пропускаются, сервер использует значения по умолчанию.

Рефакторинг и логирование:
- записи однотипных секций сведены к общим процедурам
  (ЗаписатьСекциюВерхнегоУровня, ЗаписатьПараметрыВеб_Сервисов,
  ЗаписатьПодсекциюВеб);
- добавлено отладочное логирование установки параметров и записи
  секций; пароли в лог не выводятся;
- текст ошибки о неизвестном типе значения дополнен именем параметра
  и списком допустимых типов.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Отладочное логирование установки параметров, командной строки
  запуска ibsrv, хода ожидания готовности сервера.
- Ошибки дополнены контекстом: путь к несуществующим каталогам и
  файлам, диапазон допустимых портов, идентификатор уже запущенного
  процесса, файл готовности и время ожидания при неудачном запуске.
- Префикс 'Процесс ibsrv не запустился!' сохранён — по нему работает
  ЭтоИсключенияЗапускаАС.
- Общие функции (кавычки, имя лога) перенесены в СлужебныйIbcmdRunner.
- Проверка номера порта выделена в общую процедуру.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- common_functions_tests: тесты служебного модуля (сравнение версий,
  кавычки, yes/no и true/false конверсии, проверка имён 1С, шаблоны
  переменных среды).
- configfile_as_tests: характеризационные тесты генератора YAML —
  фиксируют содержимое всех секций конфигурационного файла
  автономного сервера, включая исправленные секции application,
  http-services, allow-standard и reuse-sessions.
- ibcmdrunner_unit_tests: тесты УправлениеИБ без создания баз —
  версия, путь к приложению, разбор списка расширений по
  фиксированному тексту, контроль исключений при некорректных
  параметрах.
- ibsrvrunner_tests: исправлен вызов несуществующего метода
  УстановитьВерсию — класс всегда предоставлял только
  УстановитьВерсиюПлатформы, тест падал.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
После переработки ИзменитьСвойстваРасширения (vanessa-opensource#15) имя профиля
безопасности передаётся строкой, а не булевым значением - тест
падал на проверке типа параметра.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ручная построчная запись YAML заменена сборкой структуры данных
(вложенные Соответствия и Массивы) и сериализацией библиотекой
oscript-yaml (ПарсерYaml.ЗаписатьВФайл, UTF-8):

- корректное экранирование значений (пути с обратными слэшами,
  строки с двоеточиями) гарантирует сериализатор;
- номера портов записываются числами, а не строками в кавычках
  (ранее XMLСтрока превращала их в строки);
- незаполненные (Неопределено) параметры не попадают в файл;
- секции собираются функциями СобратьДанныеКонфигурации,
  СобратьСекциюHTTP, СобратьСекциюАутентификации,
  СобратьСекциюСервисов - код записи файла сведен к одному вызову.

Тесты генератора переведены с текстовых сравнений на семантические:
созданный файл разбирается обратно ПарсерYaml.ПрочитатьИзФайла
и проверяется структура. Путь с обратными слэшами проверяется по
тексту файла: в oscript-yaml 0.3.0 десериализатор некорректно
разбирает последовательность \b (эскейп \b обрабатывается раньше
\), сериализация при этом корректна.

Требуемая версия среды поднята до 2.0.0 (требование oscript-yaml),
добавлена зависимость oscript-yaml 0.3.0. Из служебного модуля
удалена более не используемая БулевоВСтрокуTrueFalse.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Восстановлены байт-в-байт строки оригинала, отличавшиеся только
пробелами и табами (хвостовые пробелы, пустые строки, отступы),
а также случайно затронутые рефакторингом мелочи (Найти, имена
локальных переменных). В диффе с апстримом остались только
содержательные изменения.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- СравнитьВерсии: недостающие компоненты версии считаются нулями
  на месте вместо предварительного выравнивания массивов;
- ЯвляетсяИменем: посимвольный перебор заменен регулярным выражением;
- лог имен переменных среды перенесен в ДобавитьСекретныйПараметр,
  одноразовые хелперы ВыполнитьКоманду свернуты;
- подготовка и выполнение команды создания ИБ слиты
  в ВыполнитьСозданиеИБ;
- СобратьСекциюБазыДанных заинлайнена, в ПроверитьНомерПорта
  устранено дублирование текста ошибки.

Итого -76 строк.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Segate-ekb
Segate-ekb merged commit 15b0822 into vanessa-opensource:main Aug 31, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant