TDD中Transformation动作的优先顺序

发表于:2014-3-28 11:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Jacky Shen    来源:51Testing软件测试网采编

  在TDD循环中,重构(Refactoring)是不改变行为而改变内部结构的动作,保持测试常绿。而变形(Transformation)是改变内部实现来使测试由红变绿。这些变形的变化使代码形式从特殊specific到一般generic。
  Uncle Bob的一篇文章中用了bowling game kata 和 Prime Factor kata来解释。
  然后,基于变形的复杂度,Uncle Bob列举出来并认为它们有如下优先顺序。
({}–>nil) no code at all->code that employs nil
(nil->constant)
(constant->constant+) a simple constant to a more complex constant
(constant->scalar) replacing a constant with a variable or an argument
(statement->statements) adding more unconditional statements.
(unconditional->if) splitting the execution path
(scalar->array)
(array->container)
(statement->recursion)
(if->while)
(expression->function) replacing an expression with a function or algorithm
(variable->assignment) replacing the value of a variable.
  结论是,要规避TDD常见的僵局(Impasse),即某个新test必须对代码进行巨大变化才能满足,且测试顺序的选择非常重要———那就要尽量选择高优先级(简单的)变形来满足测试,或是选择能由高优先级满足的新test case来继续,当看起来需要低优先级(复杂的)变形时,回退回去,看看还有没有更简单的test。
  他用了word wrap kata来解释这一模式。其中,为了使 
assertThat(wrap(“word word”, 6), is(“word\nword”));
  通过,Bob故意用
return s.replaceAll(” “, “\n”); //(expression->function)transformation
  ,结果陷入困境。
  然后Bob尝试认为此案例没有更好的方案,于是换了另一个测试
assertThat(wrap(“longword”, 4), is(“long\nword”));
assertThat(wrap(“longerword”, 6), is(“longer\nword”));
    然后用 (null->constant) 和(expression->function)  得到
return s.substring(0, length) + “\n” + s.substring(length);
  TDD困境主要还是在于,如果低优先级的复杂(expression->function)变形,步子更大更死板,看似简洁,实则隐藏了细节,更难“演进”实现。
  个人任务,第一个case同样可以用 (null->constant) 和(expression->function)  得到类似的方案。
  Bob的这个思路是对的,但是例子以及背后的理论证明尚不完善。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号