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

第9章:Python TDD解决货币对象相等性比较难题

写在前面


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

问题背景说明

在之前定义货币对象相等性时,仅考虑金额相等可能不够全面。当存在多种货币类时,不同货币对象即使金额相同也不应视为相等。解决这个问题可以避免在涉及多种货币的操作中出现逻辑混淆,确保程序在处理货币比较时的准确性和合理性。

在Python TDD中,当涉及到不同货币类(如DollarFranc)对象的相等性比较时,会遇到一些问题。我们需要完善相等性比较的逻辑,确保比较结果的正确性。

9.1 思路说明

之前定义的DollarFranc类的相等性判断仅基于金额,这在不同货币类之间比较时是不准确的。我们需要在相等性判断中加入货币类型的比较,只有当货币类型相同且金额相等时,两个货币对象才被认为相等。

9.2 测试代码

import unittest


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

    def __eq__(self, other):
        if isinstance(other, Money):
            return self.amount == other.amount and self.__class__ == other.__class__
        return False


class Dollar(Money):
    def __init__(self, amount):
        super().__init__(amount)


class Franc(Money):
    def __init__(self, amount):
        super().__init__(amount)


class TestMoneyEquality(unittest.TestCase):
    def test_dollar_equality(self):
        dollar1 = Dollar(5)
        dollar2 = Dollar(5)
        self.assertEqual(dollar1, dollar2)

    def test_dollar_inequality(self):
        dollar1 = Dollar(5)
        dollar2 = Dollar(10)
        self.assertNotEqual(dollar1, dollar2)

    def test_different_currency_inequality(self):
        dollar = Dollar(5)
        franc = Franc(5)
        self.assertNotEqual(dollar, franc)


if __name__ == '__main__':
    unittest.main()

9.3 源码说明

Money类的__eq__方法中,我们在判断对象是否相等时,除了比较金额self.amount == other.amount,还增加了比较对象的类类型self.__class__ == other.__class__。这样,只有当两个对象都是Money类的子类且金额相等时,才认为它们相等。在测试类TestMoneyEquality中,test_dollar_equalitytest_dollar_inequality测试用例分别验证了Dollar对象的相等和不相等情况,test_different_currency_inequality测试用例验证了不同货币类(DollarFranc)对象不相等的情况,确保相等性判断逻辑的正确性。


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

相关文章:

  • 简单介绍JSONStream的使用
  • 机器学习中的方差与偏差
  • python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换
  • 网络安全---CMS指纹信息实战
  • HTML5 Canvas实现的跨年烟花源代码
  • 128.最长连续序列
  • python爬虫报错日记
  • 初始JavaEE篇 —— 快速上手 SpringBoot
  • 【Redis】Redis 集群中节点之间如何通信?
  • [cg] glProgramBinary
  • JavaScript系列(35)-- WebSocket应用详解
  • Redis系列之底层数据结构字典Dict
  • 图像处理|顶帽操作
  • Kivy App开发之UX控件Bubble气泡
  • 使用redis-cli命令实现redis crud操作
  • Meta标签教程:提升网站SEO与用户体验的利器
  • 人工智能之数学基础:线性代数中的线性相关和线性无关
  • windows下使用docker执行器并配置 hosts 解析
  • Agent AI: 强化学习,模仿学习,大型语言模型和VLMs在智能体中的应用
  • 2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数
  • 仿 RabbitMQ 的消息队列2(实战项目)
  • 在C#中添加I/O延时和持续时间
  • Ubuntu 22.04 能识别笔记本的键盘,但是无法识别外接键盘
  • 【无界】微前端技术应用
  • 【大数据】机器学习----------降维与度量学习
  • 【自动驾驶BEV感知之tesla发展历程】