欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 第16章:Python TDD实现多币种货币运算

第16章:Python TDD实现多币种货币运算

2025/2/5 11:50:16 来源:https://blog.csdn.net/m0_48468018/article/details/145240944  浏览:    关键词:第16章:Python TDD实现多币种货币运算

写在前面


这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许优质的单元测试是一个切入点。 就我个人而言,这本书确实很有帮助。第一次读的时候,很多细节我都不太懂,但将书中内容应用到工作中后,我受益匪浅。比如面对一些让人抓狂的代码设计时,书里的方法能让我逐步深入理解代码的逻辑与设计。 作为一名测试开发工程师,我想把学习这本书的经验分享给大家,希望能给大家带来帮助。因为现在工作中大多使用 Python 代码,所以我把书中JAVA案例都用 Python 代码进行了改写 。

问题背景说明

在复杂的金融场景中,经常会遇到多种货币混合运算的情况。实现多币种货币运算能够进一步提升货币类的功能完整性,使其更贴近实际的业务需求。通过TDD实现这一功能,可以保证代码在复杂运算场景下的正确性和稳定性。

实现多币种货币运算,如$5 + 10 CHF = $10(当汇率为2:1时),是对前面功能的综合应用和拓展,也是Python TDD实践的深入。

16.1 思路说明

编写测试用例来验证多币种加法运算。在已有代码基础上,完善Sum类(用于表示货币相加的表达式)和相关类的方法,确保不同币种货币能根据汇率正确相加。

16.2 测试代码

import unittestclass Bank:def __init__(self):self.rates = {}def addRate(self, from_currency, to_currency, rate):self.rates[(from_currency, to_currency)] = ratedef rate(self, from_currency, to_currency):if from_currency == to_currency:return 1return self.rates.get((from_currency, to_currency), 1)def reduce(self, source, to):if isinstance(source, Sum):amount = source.augend.reduce(self, to).amount + source.addend.reduce(self, to).amountreturn Money(amount, to)elif isinstance(source, Money):rate = self.rate(source.currency, to)return Money(source.amount / rate, to)class Expression:def reduce(self, bank, to):passclass Money(Expression):def __init__(self, amount, currency):self.amount = amountself.currency = currencydef plus(self, addend):return Sum(self, addend)def reduce(self, bank, to):rate = self.rate(bank, to)return Money(self.amount / rate, to)class Sum(Expression):def __init__(self, augend, addend):self.augend = augendself.addend = addenddef reduce(self, bank, to):amount = self.augend.reduce(bank, to).amount + self.addend.reduce(bank, to).amountreturn Money(amount, to)class Dollar(Money):def __init__(self, amount):super().__init__(amount, "USD")class Franc(Money):def __init__(self, amount):super().__init__(amount, "CHF")class TestMixedAddition(unittest.TestCase):def test_mixed_addition(self):bank = Bank()bank.addRate("CHF", "USD", 2)five_dollars = Dollar(5)ten_francs = Franc(10)result = five_dollars.plus(ten_francs).reduce(bank, "USD")self.assertEqual(result.amount, 10)self.assertEqual(result.currency, "USD")if __name__ == '__main__':unittest.main()

16.3 源码说明

新增Expression接口,Money类和Sum类都实现了该接口的reduce方法。Sum类用于表示货币相加的表达式,包含augendaddend两个操作数。Bank类的reduce方法可以处理Sum对象和Money对象的转换。在测试用例test_mixed_addition中,创建不同货币对象进行相加并转换,验证多币种加法运算的正确性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com