第28章 测试驱动开发模式:深入绿条模式及相关技术

写在前面


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

在测试驱动开发(TDD)的实践中,我们已经了解了诸多基础概念与技术。本篇将围绕“绿条模式”展开,深入探讨伪实现、三角测量、显明实现以及从一到多等测试技术,这些技术对于高效、准确地进行测试开发至关重要。

绿条模式(Green Bar Pattern)

绿条模式的核心在于对测试结果的快速响应。当测试出现未通过的情况(即红色指示条出现),开发者需要迅速修复,使测试能够顺利运行并获得通过(显示绿色指示条)。这一模式强调了及时解决测试问题的重要性,确保代码质量在开发过程中得到持续保障。

伪实现(Fake It Until You Make It)

概念与用途

伪实现是在遇到无法通过的测试时的一种应对策略。首先,通过返回一个常量使测试能够运行起来,随后逐步将常量转变为变量表示的表达式。这种方式类似于攀岩时暂时使用的岩钉,虽未真正达到正确的代码结构,但能让测试先运行起来,为后续的代码完善提供基础。

示例代码

假设我们正在开发一个简单的测试框架,用于统计测试运行的结果。以下是伪实现的逐步演变过程:

class TestResult:def __init__(self):self.run_count = 0self.failure_count = 0# 初始伪实现,返回固定字符串def summary(self):return "1 run, 0 failed"# 第一次改进,引入运行次数变量def summary(self):return "%d run, 0 failed" % self.run_count# 最终实现,包含运行次数和失败次数def summary(self):return "%d run, %d failed" % (self.run_count, self.failure_count)

在上述代码中,TestResult类的summary方法从最初的返回固定常量字符串,逐步演变为根据实际的运行次数和失败次数生成准确的测试结果总结。

三角测量(Triangulation)

概念与原理

三角测量是一种在测试中进行抽象的方法。当有两个或更多的例子时,能够通过这些例子进行抽象,从而得出正确的设计。该方法通过增加断言,避免代码实现中的冗余和不确定性,确保代码的实现更加准确和可靠。

示例代码

以编写一个计算两个整数之和的函数为例,展示三角测量法的应用:

# 初始测试用例
def test_sum_1():assert 4 == plus(3, 1)def plus(a, b):return 4  # 初始伪实现# 使用三角测量法增加测试用例
def test_sum_2():assert 7 == plus(3, 4)# 抽象出正确的函数实现
def plus(a, b):return a + b

在这个示例中,最初的plus函数是一个简单的伪实现,返回固定值4。通过增加test_sum_2测试用例,运用三角测量法,最终推导出plus函数的正确实现为返回两个参数的和。

显明实现(Obvious Implementation)

概念与应用场景

显明实现是指在实现简单操作时,直接进行实现。当开发者有把握实现某个操作时,无需过度使用伪实现或其他复杂手段,直接编写代码。这一方法有助于提高开发效率,避免在简单问题上过度纠结。

示例代码

假设我们要实现一个将字符串首字母大写的函数:

def capitalize_first_letter(s):if not s:return sreturn s[0].upper() + s[1:]

在这个例子中,根据显明实现的原则,直接编写了将字符串首字母大写的代码,简洁明了。

从一到多(One to Many)

概念与步骤

从一到多的方法用于实现对对象集合的操作。首先,在去掉集合的情况下实现操作,然后再将集合引入。这种方式有助于逐步构建复杂的功能,同时保证代码的可测试性和可维护性。

示例代码

以编写一个计算数组元素之和的函数为例:

# 最初针对单个值的测试用例
def test_sum_single():assert 5 == sum_value(5)def sum_value(value):return value# 引入数组参数的测试用例
def test_sum_array():assert 12 == sum_values(5, [7])def sum_values(value, values):total = valuefor v in values:total += vreturn total# 最终针对数组集合的实现
def test_sum_array_final():assert 12 == sum_array([5, 7])def sum_array(values):total = 0for v in values:total += vreturn total

在这个示例中,从最初实现对单个值的处理,到引入数组参数,再到最终实现对数组集合的求和操作,逐步展示了从一到多的实现过程。

总结

测试驱动开发中的绿条模式以及伪实现、三角测量、显明实现和从一到多等技术,为开发者提供了丰富的工具和方法,帮助我们在面对各种测试场景时能够灵活应对。这些技术相互关联又各有侧重,从不同角度助力于提高测试的效率和代码的质量。在实际的软件开发过程中,合理运用这些技术,能够使测试驱动开发的流程更加顺畅,确保开发出的软件系统更加稳定、可靠。通过不断地实践和积累经验,开发者可以更好地掌握这些技术,为项目的成功交付奠定坚实基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 在Word中添加、或删除超链接

在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接,用户可以轻松地导航到相关信息,从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…

概率论里的特征函数,如何用卷积定理去理解

概率论里的特征函数,如何用卷积定理去理解_哔哩哔哩_bilibili

Unity入门1

安装之后无法获得许可证,可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用,重开vstu,或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…

如何跨互联网adb连接到远程手机-蓝牙电话集中维护

如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机,安装一个App并简单设置一下,就可以跨互联网的ADB连接到这个手机,从而远程操控这个手机做各种操作。你敢相信吗?而这正是本篇想要描述的…

单片机基础模块学习——按键

一、按键原理图 当把跳线帽J5放在右侧,属于独立按键模式(BTN模式),放在左侧为矩阵键盘模式(KBD模式) 整体结构是一端接地,一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…

第25篇 基于ARM A9处理器用C语言实现中断<一>

Q:怎样理解基于ARM A9处理器用C语言实现中断的过程呢? A:同样以一段使用C语言实现中断的主程序为例介绍,和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯&#xf…

Baklib如何提升企业的内容管理效率与协作能力

内容概要 在现代企业中,内容管理的有效性直接影响到工作效率、团队协作和创新能力。随着信息量的不断增加,企业亟需一个系统化的平台来高效处理和管理这些内容。Baklib作为一款先进的内容管理平台,通过其丰富的功能和灵活的应用场景&#xf…

【2024年终总结】深圳工作生活评测

距离上次写年终总结已经过了一年半了,这一年半中哪怕经历了很多的事情,但是感觉又没发生什么。想写一些骚话,却总觉得自己无法完全表达,便也就这样,静静地记录下这一段时光。 现在是2025年,春节前的时光&am…

【算法】分治

分治 1.逆序对2.求第 k 小的数3.最大子段和4.地毯填补问题 分治,字面上的解释是「分而治之」,就是把一个复杂的问题分成两个或更多的相同的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 1.逆序对 P…

Vue2官网教程查漏补缺学习笔记 - 3Vue实例4模板语法5计算属性监听器

3 Vue实例 3.1 创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm new Vue({// 选项 })虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)

流域综合处理 流域综合治理是根据流域自然和社会经济状况及区域国民经济发展的要求,以流域水流失治理为中心,以提高生态经济效益和社会经济持续发展为目标,以基本农田优化结构和高效利用及植被建设为重点,建立具有水土保持兼高效生态经济功能的半山区流域综合治理模式。数字高程…

对于RocksDB和LSM Tree的一些理解

LSM Tree的读写过程 HBase、LevelDB,rocksDB(是一个引擎)底层的数据结构是LSM Tree适合写多读少的场景,都是追加写入内存中的MemTable,写入一条删除(或修改)标记,而不用去访问实际的…

枚举与模拟 练习

练习题基于《C/C程序设计竞赛真题实战特训教程(图解版)》 目录 1.1 卡片 题目描述 代码实现 题解笔记 总评 注意点 重点解释 1.2 回文日期 题目描述 输入描述 输出描述 代码实现 题解笔记 总评 注意点 重点解释 1.1 卡片 题目描述 小蓝…

Linux第103步_了解I2C总线框架

了解Linux中的I2C总线框架为后面做I2C实验做准备,学驱动,就是学习框架,了解是必须的。 1、了解Linux下的I2C子系统中的相关数据结构 struct i2c_adapter { struct module *owner; unsigned int class; /* classes to allow probing for …

AAAI2024论文合集解读|Physics-Informed Representation and Learning Control and Risk

论文标题 Physics-Informed Representation and Learning: Control and Risk Quantification 物理信息表征与学习:控制与风险量化 论文链接 Physics-Informed Representation and Learning: Control and Risk Quantification论文下载 论文作者 Zhuoyuan Wang, …

【JavaEE进阶】Spring留言板实现

目录 🎍预期结果 🍀前端代码 🎄约定前后端交互接口 🚩需求分析 🚩接口定义 🌳实现服务器端代码 🚩lombok介绍 🚩代码实现 🌴运行测试 🎄前端代码实…

HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战

HackTheBox靶机:Sightless 渗透过程1. 信息收集常规探测深入分析 2. 漏洞利用(CVE-2022-0944)3. 从Docker中提权4. 信息收集(michael用户)5. 漏洞利用 Froxlor6. 解密Keepass文件 漏洞分析SQLPad CVE-2022-0944 靶机介…

Ansible入门学习之基础元素介绍

一、Ansible目录结构介绍 1.通过rpm -ql ansible获取ansible所有文件存放的目录 有配置文件目录 /etc/ansible/ 执行文件目录 /usr/bin/ 其中 /etc/ansible/ 该文件目录的主要功能是 inventory主机信息配置,ansible工具功能配置。 ansible自身的配置文件…

Antd React Form使用Radio嵌套多个Select和Input的处理

使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理&#xff0c;需要多层嵌套和处理默认事件和冒泡&#xff0c;具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…

11 蚂蚁链技术特性

概览 蚂蚁链通过引入P2P网络、共识算法、虚拟机、智能合约、密码学、数据存储等技术特性&#xff0c;构建一个稳定、高效、安全的图灵完备智能合约执行环境&#xff0c;提供账户的基本操作以及面向智能合约的功能调用。 区块结构 一个区块包含区块头和区块体&#xff0c;区块…