ПРАКТИКУМ И ДОКАЗАТЕЛЬСТВАP1L3

Независимые эталоны и метаморфные проверки финансовой логики

Как отдельно строить ожидаемый финансовый результат, проверять инварианты на большом наборе входов и не путать тест формулы с подтверждением SAP runtime.

Ревизия 1 Общие понятия Частичное покрытие Контекст: CTX-GENERAL документальная опора: недостаточно данных
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

Независимые эталоны и метаморфные проверки финансовой логики#

Финансовый тест должен проверять смысл результата, а не повторять формулу из реализации. Для этого разделяйте три подхода: эталонное сравнение ожидаемого и фактического значений; property-based проверку инвариантов на множестве входов; метаморфную проверку отношения между исходным и преобразованным сценарием.

В SAP ABAP Unit даёт механизм выполнения тестовых методов с начальными условиями и проверкой результата утверждениями. Наличие тестового метода ещё не делает ожидаемое значение независимым: эталон и его предпосылки нужно обосновать отдельно. SAP описывает ABAP Unit как инструмент запуска тестов ABAP-кода; без целевой системы локальная Python-модель не заменяет такой запуск.

Постройте независимый эталон#

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

Не вычисляйте ожидаемое значение тем же production-функционалом, который проверяете. Не копируйте ту же формулу во вторую тестовую функцию: одинаковая ошибка в обеих копиях даст ложный зелёный результат. Если сравниваете два релиза или две реализации, заранее подтвердите, что их семантика должна совпадать в выбранном сценарии. Иначе ожидаемые различия нужно задать отдельно.

Пример: точное распределение суммы#

Пусть синтетическая сумма равна 10 001 копейке, а три получателя имеют одинаковый вес. Независимый эталон задаёт результат: A получает 3 334, B получает 3 334, C получает 3 333; при равном остатке первый копеечный остаток отдан получателям по зафиксированному правилу разрешения ничьей. Проверка сверяет значения по ключу и одновременно проверяет сохранение суммы: результат в сумме равен 10 001.

Этот fixture показывает метод проверки целых денежных единиц и стабильного разрешения остатков. Он не заявляет, что SAP использует такой алгоритм распределения.

Пример: сверка по измерениям, а не только по итогу#

В источнике по ключу A записано 100, по ключу B также 100. В целевом результате A равно 80, B равно 120. Общая сумма в обоих наборах равна 200, но состав не совпадает: разница составляет +20 для A и -20 для B. Эталон должен сравнивать по всем значимым ключам, компании, периоду и валюте, иначе взаимно компенсирующие ошибки останутся незамеченными.

Проверяйте инварианты на разных входах#

Property-based подход задаёт свойства допустимого результата и генерирует много входов, вместо проверки только нескольких вручную выбранных примеров. Для синтетического распределения суммы возможны такие свойства:

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

Свойство проверяется только при оговорённых предпосылках. Например, сохранение общей суммы не доказывает правильного распределения между получателями. Для сравнения сверки нужно контролировать и итог, и состав строк.

Генератор должен создавать содержательные случаи: ноль, минимальную единицу, отрицательную сумму там, где она допустима, разные точные веса, много получателей, равные остатки и значения около порогов округления. Для некорректных данных задавайте отдельное ожидаемое поведение, например отказ при пропущенной валюте или пустом бизнес-ключе. Сохраняйте seed генератора; при сбое уменьшайте пример до минимального контрпримера и добавляйте его в фиксированный набор.

Используйте метаморфные отношения с условиями#

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

Для примера распределения с нормируемыми точными весами можно проверить:

  1. Перестановка порядка входа. Перестановка получателей или строк не меняет результат по бизнес-ключам, если порядок не имеет бизнес-смысла.
  2. Общий множитель весов. Замена весов 1:1:1 на 2:2:2 не меняет доли, если веса нормируются и прочие настройки неизменны.
  3. Изменение знака. Распределение суммы -10 001 является покомпонентной противоположностью распределения 10 001, если модель определяет такую симметрию.
  4. Разбиение независимых строк. Разбиение и объединение дают тот же агрегат только при заданных предпосылках: те же ключи и валюты, линейная операция, отсутствие промежуточного округления, порогов и изменения порядка.

Эти отношения не универсальны. Например, после округления каждой позиции отдельно агрегат может отличаться от расчёта общей суммы. Перестановка может менять результат, если бизнес-правило явно задаёт последовательность. Поэтому сначала докажите предпосылки преобразования, затем включайте его как тестовое свойство.

Проверьте, что тесты находят ошибки#

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

В существующем synthetic lab есть независимые golden fixtures для распределения, обязательств и факта, эффективных денежных потоков, строковой сверки с компенсирующими отклонениями и простого начисления. Например, fixture бюджета сравнивает ожидаемые 30 000 минорных единиц с ошибочным двойным счётом 50 000. Это показывает различие между корректной моделью и намеренно неверным вариантом, но само по себе не подтверждает обработку бюджета в SAP.

Сохраняйте воспроизводимость и область вывода#

Для каждого набора сохраняйте версию модели, параметры, ожидаемые значения, генератор и seed, точность/валюту, версии библиотек, команду и фактический результат. Отдельно указывайте, что именно проверено: локальная функция, golden fixture, ABAP Unit в конкретном SAP-релизе или только документальная спецификация. ABAP Unit, ATC, внешний Python-тест и SAP runtime отвечают на разные вопросы.

Статья описывает методику и использует синтетические примеры из проекта; новые тестовые прогоны здесь не заявляются. SAP Help источники сохранены как metadata_only. Локальные fixtures и исходники не являются свидетельством поведения SAP и не подтверждают бухгалтерскую политику какой-либо организации.

Источники и документация

  1. ABAP Unit and the Test-Driven Development Cycle ↗
  2. How to Write ABAP Unit Test Classes ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.