我不清楚TDD(该方法论)如何处理以下情况。假设我想在Python中实现mergesort算法。我首先写
assert mergesort([]) === []
并且测试失败
NameError:未定义名称“ mergesort”
然后我添加
def mergesort(a):
return []
我的测试通过了。接下来我添加
assert mergesort[5] == 5
我的测试失败了
断言错误
我通过
def mergesort(a):
if not a:
return []
else:
return a
接下来,我添加
assert mergesort([10, 30, 20]) == [10, 20, 30]
现在我必须尝试通过此步骤。我“知道” mergesort算法,所以我这样写:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
这失败了
NameError:未定义名称“合并”
现在是问题。如何开始merge
使用TDD 并开始实施?看来我做不到,因为我没有完成“挂起”的测试mergesort
,未通过,直到merge
完成,测试才能通过!如果此测试仍然存在,我将永远无法真正做到TDD,因为在TDD迭代构建过程中我不会变得“绿色” merge
。
似乎我陷入了以下三个丑陋的场景,想知道(1)TDD社区更喜欢其中哪一个,或者(2)我还缺少另一种方法?我看过鲍勃叔叔TDD演练的几本,并且不记得以前看到过这样的情况!
这是3种情况:
- 在具有不同测试套件的不同目录中实现合并。
- 开发辅助功能时,不必担心绿色,只需手动跟踪您真正要通过的测试即可。
- 注释掉(GASP!)或删除该
mergesort
调用中的行merge
;然后开始merge
工作后,将它们放回去。
这些对我来说都是愚蠢的(或者我看错了吗?)。有谁知道首选方法?
...后续的单元测试将逐渐深入研究a的实际机制
—
罗伯特·哈维,
mergesort
。如果您正在寻找实现此目标的“正确”方法,除了准确地将mergesort
算法映射到一系列单元测试之外,没有其他方法了。即,他们应该反映mergesort
实际情况。
设计不能仅仅依靠单元测试来发展。如果您期望
—
罗伯特·哈维
mergesort
设计从红绿重构中自然而然地出现,那么除非您根据现有的知识来指导流程,否则不会发生这种情况mergesort
。
在TDD中,
—
法比奥
merge
必须仅在“重构”阶段才发明。如果您看到merge
可以通过该方法来通过mergesort
您的测试,请首先使您的测试通过而不使用merge
方法。然后通过介绍merge
方法重构您的实现。
mergesort
,由于它已经是一个定义非常明确的算法,因此不需要此发现过程,然后就需要将您已经知道的设计映射到一系列单元测试。大概是,您的顶级测试断言您所测试的方法接受未排序的集合并返回已排序的集合……