当前位置: 首页 > article >正文

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

写在前面


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

问题背景说明

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

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

16.1 思路说明

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

16.2 测试代码

import unittest


class Bank:
    def __init__(self):
        self.rates = {}

    def addRate(self, from_currency, to_currency, rate):
        self.rates[(from_currency, to_currency)] = rate

    def rate(self, from_currency, to_currency):
        if from_currency == to_currency:
            return 1
        return 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).amount
            return 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):
        pass


class Money(Expression):
    def __init__(self, amount, currency):
        self.amount = amount
        self.currency = currency

    def 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 = augend
        self.addend = addend

    def reduce(self, bank, to):
        amount = self.augend.reduce(bank, to).amount + self.addend.reduce(bank, to).amount
        return 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中,创建不同货币对象进行相加并转换,验证多币种加法运算的正确性。


http://www.kler.cn/a/511309.html

相关文章:

  • 农业农村大数据应用场景|珈和科技“数字乡村一张图”解决方案
  • 计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
  • k8s集群安装
  • 最新版Edge浏览器加载ActiveX控件技术——allWebPlugin中间件之awp_CreateActiveXObject接口用法
  • AI守护煤矿安全生产:基于视频智能的煤矿管理系统架构全解析
  • Java——Stream流的peek方法详解
  • 团体程序设计天梯赛-练习集——L1-013 计算阶乘和
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>N 皇后
  • ASP.NET Core Web API 创建指南
  • 基于Springboot的二手车交易系统【附源码】
  • Swift Parameter-free Attention Network模型详解及代码复现
  • 【Web】2025-SUCTF个人wp
  • SpringBoot+Vue小区智享物业管理系统(高质量源码,可定制,提供文档,免费部署到本地)
  • Spring Boot 整合 Redis:提升应用性能的利器
  • Json学习与实践
  • 开发模式(webpack-dev-server)
  • C语言之字符函数和字符串函数(下)
  • 如何使用 Pytest 断言测试 Python 异常处理
  • 计算机网络 (51)鉴别
  • Mysql 主从复制原理及其工作过程,配置一主两从实验
  • LeetCode热题100(子串篇)
  • CesiumLab和CIMRTS的尝试融合
  • 学技术学英语:TCP的三次握手和四次挥手
  • 基于PSO粒子群优化TCN时间卷积神经网络时间序列预测算法matlab仿真
  • 代码随想录26
  • OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用