Unit testing 究竟什么是';Saff挤压&x27;找到bug的方法?

Unit testing 究竟什么是';Saff挤压&x27;找到bug的方法?,unit-testing,debugging,language-agnostic,tdd,saff-squeeze,Unit Testing,Debugging,Language Agnostic,Tdd,Saff Squeeze,我读过Kent Beck关于Saff挤压法的原始博客。我也读过这篇文章,它对这个话题做了更多的阐述,但没有提供任何例子 我知道,这本质上是一种不依赖调试器就可以找到bug的方法。然而,我发现肯特的例子并不那么清楚 有没有更开明的人能用一个清晰、具体的例子来教育我如何使用这种方法?它有望成为其他研究该方法的人的学习资源。该示例显示他正在将测试中的代码内联复制(内联)到他的单元测试中。然后从开始到结束分别测试代码的各个部分。这使他能够单独测试每条路径,并在尽可能小的单元上生成单元测试。其中一个测试将

我读过Kent Beck关于Saff挤压法的原始博客。我也读过这篇文章,它对这个话题做了更多的阐述,但没有提供任何例子

我知道,这本质上是一种不依赖调试器就可以找到bug的方法。然而,我发现肯特的例子并不那么清楚


有没有更开明的人能用一个清晰、具体的例子来教育我如何使用这种方法?它有望成为其他研究该方法的人的学习资源。

该示例显示他正在将测试中的代码内联复制(内联)到他的单元测试中。然后从开始到结束分别测试代码的各个部分。这使他能够单独测试每条路径,并在尽可能小的单元上生成单元测试。其中一个测试将演示该缺陷,您将能够修复您的缺陷。他展示的示例取决于Eclipse内联方法的能力,如果您没有内联方法,则需要手动完成(将调用的代码复制到单元测试)

Saff压缩是一种系统化的技术,用于从失败的测试中删除测试代码和非测试代码,直到测试和代码小到可以理解为止

我同意这有点困难,部分原因是他正在测试的软件JUnit是高度抽象的,部分原因是他没有给出足够的步骤2示例,“在测试中比现有断言更早地放置(失败的)断言。”

在他的第一轮测试中,他只是在测试中将断言移到更高的位置,他对后续步骤的总结可能会让你认为,在第二步中,你唯一能做的就是移动现有断言,但在最后一步,他提出了一个新的、更简单的失败断言。步骤2中的断言可能只是测试中的一个已存在的断言,这很常见,但也可能是随着对代码和bug的理解的发展而产生的一个新断言

这里有一个例子。它太简单了,不需要Saff挤压,但它说明了这项技术

我刚刚写了一个关键任务类:

类自动驾驶仪
def自动飞行至(城市)
城市跑道=城市跑道
跑道=城市中最近的可用跑道
飞行计划=飞行计划至跑道
执行飞行计划
结束
定义自身跑道(城市)
机场。地点(城市:城市)。地图(&:跑道)。展平
结束
def自身。最近可用的_(跑道)
跑道。选择{| r | r.available?}
.按{| r |当前位置之间的距离| u,r.position}对| u进行排序。最后
结束
定义自飞行计划(跑道)
飞行计划.新跑道.纬度,跑道.经度
结束
#其他方法留待想象
结束
下面是我为测试它而编写的第一个rspec示例:

描述自动驾驶仪
描述“.fly_to”do
它“飞到唯一可用的跑道”吗
自动驾驶仪存根(:当前位置){position.new 0,0}
附近的_跑道=创建:跑道,纬度:1,经度:1
创建:跑道,城市:附近的_跑道。城市,纬度:2,经度:2
flight_plan=FlightPlan.new Nearly_runway.latitude,Nearly_runway.latitude
#请将下面这行代码视为示例的结尾,因为这是它生效的时间
自动驾驶仪。应接收(:执行)。带有飞行计划
自动驾驶仪。飞到附近的跑道。机场。城市
结束
结束
结束
哦,不——最后一行失败了,显示以下消息:“Expectation failed:Expected Autopilot.carry_out将使用FlightPlan(纬度:1,经度:1)调用,但它是使用FlightPlan(纬度:2,经度:2)调用的”。我不知道那是怎么发生的。我们最好使用Saff挤压机

内联方法(重命名本地方法以避免名称冲突):

它“飞到唯一可用的跑道”吗
自动驾驶仪存根(:当前位置){position.new 0,0}
附近的_跑道=创建:跑道,纬度:1,经度:1
创建:跑道,城市:附近的_跑道。城市,纬度:2,经度:2
flight_plan=FlightPlan.new Nearly_runway.latitude,Nearly_runway.latitude
自动驾驶仪。应接收(:执行)。带有飞行计划
城市跑道=城市跑道
跑道=城市中最近的可用跑道
实际飞行计划=飞行计划至跑道
自动驾驶。执行实际飞行计划
结束
我不认为最后一行怎么会不符合预期,只要它得到了正确的飞行计划。让我们看看是否可以在测试的更高层编写一个失败的断言:

它“飞到唯一可用的跑道”吗
自动驾驶仪存根(:当前位置){position.new 0,0}
附近的_跑道=创建:跑道,纬度:1,经度:1
创建:跑道,城市:附近的_跑道。城市,纬度:2,经度:2
flight_plan=FlightPlan.new Nearly_runway.latitude,Nearly_runway.latitude
自动驾驶仪。应接收(:执行)。带有飞行计划
城市跑道=城市跑道
跑道=城市中最近的可用跑道
实际飞行计划=飞行计划至跑道
实际飞行计划。应==飞行计划
自动驾驶。执行实际飞行计划
结束
啊,新的断言也失败了,“预期的FlightPlan(纬度:1,经度:1),但得到了FlightPlan(纬度:2,经度:2)”。好的,让我们简化测试:

它“飞到唯一可用的跑道”吗
自动驾驶仪存根(:当前位置){position.new 0,0}
附近的_跑道=创建:跑道,纬度:1,经度:1
创建:跑道,城市:附近的_跑道。城市,纬度:2,经度:2
flight_plan=FlightPlan.new Nearly_runway.latitude,Nearly_runway.latitude
城市跑道=城市跑道
跑道=城市中最近的可用跑道
实际飞行计划=飞行计划至跑道
实际飞行计划。应==飞行计划
结束
我们正在取得进展,但我还是不知道出了什么问题。更好的安全再次挤压,将
飞行计划\u内联到

it“飞到唯一可用的r