第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,一经查实,立即删除!

相关文章

SpringAI基于API对大语言模型调用

引言 随着人工智能技术的迅猛发展,大型语言模型(LLM)在各个领域的应用越来越广泛。SpringAI作为一个旨在简化AI集成的框架,为开发者提供了高效、便捷的工具来连接和调用这些大模型。本文将详细探讨如何使用SpringAI整合通义千问等…

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

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

Spring 源码学习(七)——注解后处理器-2

五 InitDestroyAnnotationBeanPostProcessor 类 1 属性 InitDestroyAnnotationBeanPostProcessor 类用于处理初始化与销毁注解;其中第一个属性为用于标识初始化方法与销毁方法注解类型的 initAnnotationType 与 destroyAnnotationType 属性、还有一个用于标识执行顺…

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

概率论里的特征函数,如何用卷积定理去理解_哔哩哔哩_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…

debian12.9编译freeswitch1.10.12【默认安装】

服务器操作系统 cat /etc/os-release PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME"Debian GNU/Linux" VERSION_ID"12" VERSION"12 (bookworm)" VERSION_CODENAMEbookworm IDdebian HOME_URL"https://www.debian.org/&quo…

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

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

【算法】分治

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

MongoDB 数据库备份和恢复全攻略

在当今数据驱动的时代,数据库的稳定运行和数据安全至关重要。MongoDB 作为一款流行的 NoSQL 数据库,以其灵活的文档模型和高扩展性备受青睐。然而,无论数据库多么强大,数据丢失的风险始终存在,因此掌握 MongoDB 的备份…

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

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

LabVIEW橡胶动态特性测试系统

本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量,并通过虚拟仪器技术,提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析,适用于工业和科…

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

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

IOS 安全机制拦截 window.open

摘要 在ios环境,在某些情况下执行window.open不生效 一、window.open window.open(url, target, windowFeatures) 1. url:「可选参数」,表示你要加载的资源URL或路径,如果不传,则打开一个url地址为about:blank的空…

Java stream流的避坑指南

在使用Java Stream API时,虽然它提供了强大的功能来简化集合操作,但也存在一些常见的“坑”需要注意。以下是详细的避坑指南: 1. Stream的不可重用性 问题:Stream一旦被消费(如调用forEach、collect等终端操作&#…

对于RocksDB和LSM Tree的一些理解

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

偏差(Bias)和方差(Variance)

在机器学习中,偏差(Bias)和方差(Variance)是模型预测误差的两个主要组成部分,它们描述了模型在训练和预测过程中可能出现的两种不同类型的错误。 偏差(Bias) 偏差指的是模型在训练…