Какую валюту использовать в юнит-тестах?
Я разрабатываю приложение, которое в значительной степени опирается на Joda-Money, и у меня есть ряд модульных тестов, которые проверяют мою бизнес-логику. Одним (по общему признанию незначительным) камнем преткновения для меня было то, какого рода Money
/BigMoney
объекты для тестирования; конкретно что CurrencyUnit
использовать.
На мой взгляд, у меня есть несколько вариантов:
Просто используйте
USD
Это, безусловно, самый простой способ, и большая часть моего реального приложения будет работать с долларами США, так что это имеет смысл. С другой стороны, он кажется скорее ориентированным на США, и я обеспокоен тем, что он рискнул бы позволить неконтролируемым ошибкам в конкретной валюте.
Используйте другую реальную валюту, например
CAD
Это поймает ошибочные жесткие коды
USD
, но в остальном не намного лучше, чем просто с помощьюUSD
,Используйте выделенную "фальшивую" валюту, т.е.
XTS
Это ясно имеет смысл, в конце концов,
XTS
"зарезервировано для использования в тестировании". Но Йода обозначает псевдо-валюты как валюты с-1
десятичные разряды. На практике основная разница между валютами в Joda-Money заключается в количестве десятичных разрядов, поэтому возникает риск маскирования любых ошибок, связанных с точностью до десятичного разряда, таких как ошибочное округление до целочисленного значения.Зарегистрируйте мою собственную валюту с
CurrencyUnit.registerCurrency()
Это, очевидно, сработает, но выглядит немного странно, поскольку есть альтернативы.
Использовать
CurrencyUnit
экземпляр, созданный насмешливой библиотекойПочти так же, как регистрация пользовательской валюты.
Опять же, это, очевидно, незначительная проблема, но мне любопытно, есть ли стандартная практика для подобных случаев, или если есть явная причина предпочесть один из этих вариантов в частности.
1 ответ
Используйте USD (или, как правило, любую валюту, наиболее часто используемую в вашем приложении). Я говорю это по двум причинам:
Хорошие тестовые данные ничем не примечательны во всех отношениях, кроме той их части, о которой фактически идет тест. Когда вы пишете тесты, которые не имеют никакого отношения к различиям между валютами, вам не нужно думать о различиях между валютами. Просто используйте все, что наиболее естественно в приложении.
Идея о том, что повсеместное использование необычной валюты каким-то образом приведет к лучшему тестированию необычных валют, - красная сельдь Тесты должны быть четкими и целенаправленными. Если вам нужно проверить что-то о конкретной валюте, напишите тест, цель которого - проверить это. И если тест не относится к конкретной валюте, он не должен прерываться при обработке какого-то необычного аспекта этих валютных разрывов - не имеет смысла, чтобы половина ваших тестов прерывалась по той же причине; Вы хотите, чтобы только один сломался. Поэтому нет необходимости распространять необычные валюты по всему тестовому набору и надеяться, что это что-то поймает. Вместо этого оптимизируйте для удобочитаемости; см. пункт 1
Поскольку большая часть вашего приложения работает с долларами США, имеет смысл использовать их для подавляющего большинства ваших тестов. Какие ошибки, связанные с валютой, могут произойти? Пропущенные полпенни при начислении процентов? Преобразование в иену и обратно на цент или два меньше? Напишите тесты для этого.
На вашем месте я бы запустил локальный REPL (Scala REPL работает очень хорошо, если у вас нет JShell), провел бы несколько экспериментов. Вы, вероятно, обнаружите, что волновались напрасно. Или вы можете обнаружить, что действительно есть ошибка, и ваш сеанс REPL проинформирует, как вы пишете тест для этой ошибки.
Вы используете Joda Money, потому что не хотите изобретать именно это колесо. Я не осознавал этого, пока не прочитал детали вопроса. Предположительно, Joda Money была тщательно протестирована своими разработчиками и делает все, что вы от нее ожидаете. Вам не нужно проверять это снова.
Но если бы вы создавали свой собственный класс для представления денежных сумм, я бы посоветовал вам использовать доллары США, евро, японские иены и ливийские динары (LYD). Причина появления первых трех очевидна. Я предлагаю ливийские динары из-за трех знаков после запятой. Насколько я могу судить, физическая монета в 1 дирхам отсутствует, поэтому, например, 513 дарахим будут округлены до 500 дарахим, а 997 дарахим будут округлены до полного динара.
Чтобы проверить конверсию, я бы начал с восточно-карибских долларов (XCD), поскольку они предназначены для обмена на 2,70 доллара США. Позже вы можете беспокоиться о валютах, которые колеблются по отношению друг к другу, и о том, собираетесь ли вы бороться с ними, имитируя сервер ставок, или подключаясь к фактическому серверу ставок, но добавляя отклонения в свои тесты или каким-либо другим способом..