第28章 测试驱动开发模式:深入绿条模式及相关技术
写在前面
这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许优质的单元测试是一个切入点。 就我个人而言,这本书确实很有帮助。第一次读的时候,很多细节我都不太懂,但将书中内容应用到工作中后,我受益匪浅。比如面对一些让人抓狂的代码设计时,书里的方法能让我逐步深入理解代码的逻辑与设计。 作为一名测试开发工程师,我想把学习这本书的经验分享给大家,希望能给大家带来帮助。因为现在工作中大多使用 Python 代码,所以我把书中JAVA案例都用 Python 代码进行了改写 。
在测试驱动开发(TDD)的实践中,我们已经了解了诸多基础概念与技术。本篇将围绕“绿条模式”展开,深入探讨伪实现、三角测量、显明实现以及从一到多等测试技术,这些技术对于高效、准确地进行测试开发至关重要。
绿条模式(Green Bar Pattern)
绿条模式的核心在于对测试结果的快速响应。当测试出现未通过的情况(即红色指示条出现),开发者需要迅速修复,使测试能够顺利运行并获得通过(显示绿色指示条)。这一模式强调了及时解决测试问题的重要性,确保代码质量在开发过程中得到持续保障。
伪实现(Fake It Until You Make It)
概念与用途
伪实现是在遇到无法通过的测试时的一种应对策略。首先,通过返回一个常量使测试能够运行起来,随后逐步将常量转变为变量表示的表达式。这种方式类似于攀岩时暂时使用的岩钉,虽未真正达到正确的代码结构,但能让测试先运行起来,为后续的代码完善提供基础。
示例代码
假设我们正在开发一个简单的测试框架,用于统计测试运行的结果。以下是伪实现的逐步演变过程:
class TestResult:
def __init__(self):
self.run_count = 0
self.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 s
return 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 = value
for v in values:
total += v
return total
# 最终针对数组集合的实现
def test_sum_array_final():
assert 12 == sum_array([5, 7])
def sum_array(values):
total = 0
for v in values:
total += v
return total
在这个示例中,从最初实现对单个值的处理,到引入数组参数,再到最终实现对数组集合的求和操作,逐步展示了从一到多的实现过程。
总结
测试驱动开发中的绿条模式以及伪实现、三角测量、显明实现和从一到多等技术,为开发者提供了丰富的工具和方法,帮助我们在面对各种测试场景时能够灵活应对。这些技术相互关联又各有侧重,从不同角度助力于提高测试的效率和代码的质量。在实际的软件开发过程中,合理运用这些技术,能够使测试驱动开发的流程更加顺畅,确保开发出的软件系统更加稳定、可靠。通过不断地实践和积累经验,开发者可以更好地掌握这些技术,为项目的成功交付奠定坚实基础。