第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)对象不相等的情况,确保相等性判断逻辑的正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956719.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pix2Pix :用于图像到图像转换的条件生成对抗网络

1. 背景与问题 图像到图像的转换(Image-to-Image Translation)是计算机视觉中的一个重要任务,指的是在输入一张图像的情况下,生成一张风格、内容或其他条件不同但语义一致的图像。随着深度学习的发展,尤其是生成对抗网…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…

docker 安装 nanomq

1.拉取镜像 docker pull emqx/nanomq:latest 2. 创建配置文件夹(示例放在/home/nanomq) mkdir nanomq chomd 777 nanomq3. 创建配置文件(nanomq.conf)写入以下内容 mqtt {property_size 32max_packet_size 10KBmax_mqueue_le…

【STM32G4xx的CAN驱动记录】

STM32G4xx的CAN驱动记录 CAN说明CAN的波特率计算数据测试总结 本文主要记录了基于STM32G4xx的CAN接口解析某型号雷达数据遇到的问题及规避方法,CAN总线波特率500Kbps,采样点要求80%附近。 注意CAN总线同步段的时间!!! …

2024年CSDN博客之旅:成长、创作与生活的交响曲

文章目录 《2024年博客之旅:成长、创作与生活的交响曲》一、引言二、个人成长与突破盘点(一)技术能力的提升(二)解决问题能力的增强(三)沟通与表达能力的进步 三、年度创作历程回顾(…

微服务与docker

准备工作 在课前资料中给大家提供了黑马商城项目的资料,我们需要先导入这个单体项目。不过需要注意的是,本篇及后续的微服务学习都是基于Centos7系统下的Docker部署,因此你必须做好一些准备: Centos7的环境及一个好用的SSH客户端装好Docker会使用Docker如果是学习过上面Doc…

docker离线安装及部署各类中间件(x86系统架构)

前言:此文主要针对需要在x86内网服务器搭建系统的情况 一、docker离线安装 1、下载docker镜像 https://download.docker.com/linux/static/stable/x86_64/ 版本:docker-23.0.6.tgz 2、将docker-23.0.6.tgz 文件上传到服务器上面,这里放在…

02内存结构篇(D3_对象的创建历程)

目录 一、学习前言 二、对象的创建:指针碰撞 & 空闲列表 三、对象的内存布局:三部分组成 1. 对象头 2. 实例数据 3. 对齐填充 四、对象的访问定位 1. 句柄访问 2. 直接指针访问 3. 两者访问方式比较 一、学习前言 运行时数据区了解了&…

Linux系统之kill命令的基本使用

Linux系统之kill命令的基本使用 一、kill命令介绍1. kill命令简介2. kill命令的使用场景3. kill命令使用注意事项 二、kill命令的使用帮助1. 查看kill命令帮助信息2. kill命令帮助解释 三、kill常用的信号1. 列出所有的信号2.kill常用的信号 四、kill命令的基本使用1. 运行一个…

【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:product.kylinos.cn 开发者专区:developer.kylinos.cn 文档中心:document.kylinos.cn 交流论坛:forum.kylinos.cn 服务器环境以及配置 【内核版本…

leetcode49-字母异位词分组

leetcode 49 思路 通过一个哈希表进行记录每个分组,遍历strs,然后对每个字符串item进行排序,比如:acb bac cab都会被排序为’abc’,然后以abc作为map的key,value就是存放所有匹配出来为key的值,最后把ma…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务(DDoS)攻击,而OpenAI尚未承认这一漏洞。 本月,德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章,解释了如何通过向ChatGPT API发送单个HTTP请求…

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络(Generative Adversarial Networks, GANs)是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分:生成器(Generator)和判别器(Discriminator)…

Java工程结构:服务器规约(JVM 碰到 OOM 场景时输出 dump 信息、设置tomcat的 JVM 的内存参数、了解服务平均耗时)

文章目录 I 调用远程操作必须有超时设置。II 推荐了解每个服务大致的平均耗时JVM 的 Xms 和 Xmx 设置一样大小的内存容量让 JVM 碰到 OOM 场景时输出 dump 信息调大服务器所支持的最大文件句柄数(File Descriptor,简写为 fd)高并发服务器建议调小 TCP 协议的 time_wait 超时…

1.3.浅层神经网络

目录 1.3.浅层神经网络 1.3.1 浅层神经网络表示 1.3.2 单个样本的向量化表示 1.3.4 激活函数的选择 1.3.5 修改激活函数 1.3.5 练习​​​​​​​ 1.3.浅层神经网络 1.3.1 浅层神经网络表示 之前已经说过神经网络的结构了,在这不重复叙述。假设我们有如下…

24年总结 -- 共赴心中所向往的未来

一、前言 我又回来了,前阵子忙着期末考试的东西,也是快半个月没更新了,刚好前几天报名了博客之星的评选,也很幸运的入围了,也借此机会来回顾一下关于2024年的个人成长、创作经历等。 二、个人 本人是一个双非学校的软…

稳定的通信桥梁,CCLINKIE转ModbusTCP网关实现AGV运输的光速效应

三菱PLC与AGV机器人搬运车通过稳联技术协议转换网关建立通信 一、现场情况概述 - 三菱PLC:使用CC-Link IE协议进行通信。 - AGV机器人搬运车:使用Modbus TCP协议进行通信。 - 协议转换网关:使用稳联技术的协议转换网关将PLC和AGV连接&#xf…

kubuntu24.04配置vmware17.5.1

背景 个人主机的最后一次折腾吧。 丝滑上网前提:singbox实践https://blog.csdn.net/qq_43652666/article/details/145190110 vmware 博通官网下载vmware workstation pro 17.5.1版本,注意一个新注册的账号只能下载一个win版本的vmware和一个linux版本…

基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)

个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境:最好是java jdk 1.8,我们在这个平台…

NavVis手持激光扫描帮助舍弗勒快速打造“数字孪生”工厂-沪敖3D

在全球拥有近100家工厂的舍弗勒,从2016年开启数字化运营进程,而当前制造、库存、劳动力和物流的数字化,已无法支持其进一步简化工作流程,亟需数字化物理制造环境,打造“数字孪生”工厂。 NavVis为其提供NavVis VLX 3…