在单元测试中使用什么货币?
What currency to use in unit tests?
我正在开发一个严重依赖 Joda-Money 的应用程序,并且有许多单元测试可以验证我的业务逻辑。对我来说,一个(诚然次要的)症结点是要测试什么样的 Money
/BigMoney
对象;具体来说,CurrencyUnit
使用什么。
在我看来,我有几个选择:
只需使用USD
这显然是最简单的方法,而且我的大部分实际应用程序都将使用美元,所以这很合理。另一方面,感觉它以美国为中心,我担心它会冒着让货币特定错误得不到检查的风险。
使用其他真实货币,例如CAD
这会捕获 USD
的错误硬编码,但除此之外并不比仅使用 USD
.
好多少
使用专用的 "fake" currency,即 XTS
这显然有道理,毕竟XTS
是“留作测试用”的。但是 Joda 将伪货币表示为具有 -1
小数位的货币。实际上,Joda-Money 中货币之间的主要区别在于小数位数,因此这可能会掩盖任何涉及小数位精度的错误,例如错误地四舍五入为整数值。
用CurrencyUnit.registerCurrency()
注册我自己的自定义货币
这显然可行,但看起来有点奇怪,因为还有其他选择。
使用由模拟库创建的 CurrencyUnit
实例
与注册自定义货币几乎相同。
同样,这显然是一个小问题,但我很好奇是否有针对此类情况的标准做法,或者是否有明确的理由特别喜欢这些选项之一。
使用美元(或者,通常,您的应用程序中最常用的任何货币)。我这样说有两个原因:
良好的测试数据除了测试实际涉及的部分外,在各个方面都没有什么特别之处。当您编写与货币之间的差异无关的测试时,您不想考虑货币之间的差异。只需使用应用程序中最自然的任何内容即可。
认为在任何地方都使用不寻常货币会以某种方式更好地测试不寻常货币的想法是转移注意力。测试应该是明确的和有重点的。如果您需要测试关于特定货币的某些东西,请编写一个测试,其目的是测试那个东西。而且,如果测试与特定货币无关,那么在处理该货币的某些异常方面时,它不应该中断——出于同样的原因让一半的测试中断是没有价值的;你只想打破一个。因此,没有必要在测试套件周围散布不寻常的货币并希望它能捕捉到一些东西。相反,优化可读性;参见第 1 点。
由于您的大部分应用程序都与美元打交道,因此将它们用于绝大多数测试是有意义的。您担心会发生哪些 currency-specific 错误?复利时少了半便士?日元和日元的兑换差了一两美分?为此编写测试。
如果我是你,我会启动一个本地 REPL(如果你没有 JShell,Scala REPL 工作得很好),运行 一些实验。您可能会发现自己的担心是徒劳的。或者您可能会发现确实存在缺陷,您的 REPL 会话将告知您如何针对该缺陷编写测试。
您使用 Joda Money 是因为您不想重新发明这个特定的轮子。直到我阅读了问题的详细信息,我才意识到这一点。据推测,Joda Money 已经过其开发人员的严格测试,它可以完成您期望的一切。您无需再次测试。
但如果您要自己制作 class 来表示金额,我建议您使用美元、欧元、日元和利比亚第纳尔 (LYD)。前三个原因很明显。我建议使用利比亚第纳尔,因为小数点后三位。据我所知,没有实际的 1 迪拉姆硬币,因此,例如,513 达拉欣将四舍五入为 500 达拉欣,而 997 达拉欣将四舍五入为完整的第纳尔。
为了测试换算,我将从东加勒比元 (XCD) 开始,因为它们固定兑换为 2.70 美元。稍后您可能会担心相互波动的货币,以及您是通过模拟汇率服务器来处理它们,还是通过连接到实际汇率服务器但在测试中放置差异或通过其他方式来处理它们.
我正在开发一个严重依赖 Joda-Money 的应用程序,并且有许多单元测试可以验证我的业务逻辑。对我来说,一个(诚然次要的)症结点是要测试什么样的 Money
/BigMoney
对象;具体来说,CurrencyUnit
使用什么。
在我看来,我有几个选择:
只需使用
USD
这显然是最简单的方法,而且我的大部分实际应用程序都将使用美元,所以这很合理。另一方面,感觉它以美国为中心,我担心它会冒着让货币特定错误得不到检查的风险。
使用其他真实货币,例如
CAD
这会捕获
好多少USD
的错误硬编码,但除此之外并不比仅使用USD
.使用专用的 "fake" currency,即
XTS
这显然有道理,毕竟
XTS
是“留作测试用”的。但是 Joda 将伪货币表示为具有-1
小数位的货币。实际上,Joda-Money 中货币之间的主要区别在于小数位数,因此这可能会掩盖任何涉及小数位精度的错误,例如错误地四舍五入为整数值。用
注册我自己的自定义货币CurrencyUnit.registerCurrency()
这显然可行,但看起来有点奇怪,因为还有其他选择。
使用由模拟库创建的
CurrencyUnit
实例与注册自定义货币几乎相同。
同样,这显然是一个小问题,但我很好奇是否有针对此类情况的标准做法,或者是否有明确的理由特别喜欢这些选项之一。
使用美元(或者,通常,您的应用程序中最常用的任何货币)。我这样说有两个原因:
良好的测试数据除了测试实际涉及的部分外,在各个方面都没有什么特别之处。当您编写与货币之间的差异无关的测试时,您不想考虑货币之间的差异。只需使用应用程序中最自然的任何内容即可。
认为在任何地方都使用不寻常货币会以某种方式更好地测试不寻常货币的想法是转移注意力。测试应该是明确的和有重点的。如果您需要测试关于特定货币的某些东西,请编写一个测试,其目的是测试那个东西。而且,如果测试与特定货币无关,那么在处理该货币的某些异常方面时,它不应该中断——出于同样的原因让一半的测试中断是没有价值的;你只想打破一个。因此,没有必要在测试套件周围散布不寻常的货币并希望它能捕捉到一些东西。相反,优化可读性;参见第 1 点。
由于您的大部分应用程序都与美元打交道,因此将它们用于绝大多数测试是有意义的。您担心会发生哪些 currency-specific 错误?复利时少了半便士?日元和日元的兑换差了一两美分?为此编写测试。
如果我是你,我会启动一个本地 REPL(如果你没有 JShell,Scala REPL 工作得很好),运行 一些实验。您可能会发现自己的担心是徒劳的。或者您可能会发现确实存在缺陷,您的 REPL 会话将告知您如何针对该缺陷编写测试。
您使用 Joda Money 是因为您不想重新发明这个特定的轮子。直到我阅读了问题的详细信息,我才意识到这一点。据推测,Joda Money 已经过其开发人员的严格测试,它可以完成您期望的一切。您无需再次测试。
但如果您要自己制作 class 来表示金额,我建议您使用美元、欧元、日元和利比亚第纳尔 (LYD)。前三个原因很明显。我建议使用利比亚第纳尔,因为小数点后三位。据我所知,没有实际的 1 迪拉姆硬币,因此,例如,513 达拉欣将四舍五入为 500 达拉欣,而 997 达拉欣将四舍五入为完整的第纳尔。
为了测试换算,我将从东加勒比元 (XCD) 开始,因为它们固定兑换为 2.70 美元。稍后您可能会担心相互波动的货币,以及您是通过模拟汇率服务器来处理它们,还是通过连接到实际汇率服务器但在测试中放置差异或通过其他方式来处理它们.