Как тестировать формулу вычисления начальной маржи
Что проверяют
Умеете ли вы тестировать расчёт, а не экран: откуда взять ожидаемое значение, как разбить входные данные на классы и где у финансовой формулы прячутся ошибки. Следом почти всегда спрашивают: «А кто вам скажет, что правильный ответ именно такой?»
Как отвечать
Начните с формулы и её источника. Начальная маржа это сумма обеспечения, которую брокер или биржа требует для открытия позиции. Обычно это стоимость позиции, умноженная на ставку риска, с поправками на валюту и направление сделки. Уточните у аналитика, откуда берутся ставки, как часто они меняются и по какой цене оценивается позиция.
Дальше каркас:
- оракул: ожидаемые значения считаются независимо от продукта, в таблице или коротком скрипте, по документу, а не по коду разработчика;
- классы эквивалентности: лонг и шорт, один инструмент и портфель, рублёвый и валютный актив, категории клиентов со своими ставками;
- граничные значения: нулевая позиция, один лот, очень крупная позиция, ставка риска 0 и 100%, отрицательные и пустые входы, которые должны отклоняться;
- округление: до какого знака и по какому правилу (математическое или банковское), на каком шаге округляется промежуточный результат;
- изменение во времени: пересчёт при смене цены, курса или ставки риска, поведение в момент обновления справочника.
Автоматизировать удобнее на уровне API или юнитов, а не через интерфейс: параметризованный тест (@ParameterizedTest с @CsvFileSource в JUnit 5 или pytest.mark.parametrize) прогоняет таблицу из сотни наборов за секунды. Эта же таблица становится регрессионным набором эталонных значений.
Где спотыкаются
Проверяют пару круглых чисел вроде 100 и 1000. На них не видно ни ошибки округления, ни перепутанного порядка операций.
Считают ожидаемый результат через double или float в самом автотесте. Для денег нужен BigDecimal или Decimal, иначе тест будет краснеть на копейках или, хуже, пропускать реальную ошибку.
Предлагают Selenium для проверки формулы. Прогон через браузер медленный и хрупкий, а расчёт живёт в сервисе, и проверять его стоит там.