2009-01-15 40 views
5

当你想出一个关于系统的一部分应该如何工作的总体设计/想法时,你如何决定从何时开始进行TDD,或者说,你如何决定从第一次测试开始?你会从哪开始?

回答

7

让我们假设我正在编写一个名为Oven的类来烘焙我的美味Pie对象。这是我如何通过单元测试顺序:

  1. 我需要做什么来实例化对象?在这种情况下,它很可能是Oven oven = new Oven();没有这个测试,我想。
  2. 如何准备对象以供使用? oven.turnOn(int degrees)听起来不错,我会那样做。我如何检查它?最好使oven.getTemperature()。有一个明显的考验。
  3. 好吧,烤箱现在已经够热,我想烤我的Pie。为此,我需要oven.bake(Pie p),所以我会做到这一点。但现在呢?我想检查馅饼是否准备好了,而不是让oven.isPieReady()我认为oven.pastryStatus()返回的东西如“烤箱里没有东西”,“原料”,“几乎完成”,“煮熟”和“烧焦”听起来不错,一般应该比oven.isPieReady()更可扩展,所以我会这样做。

等等等等。所以,我会做我的测试,以便我期望使用这个对象来完善规范。最后,我通常会用相当简单但功能强大的API来完成我想要的功能。在我单元测试了我的API之后,我运行了我的代码的覆盖范围,以查看我错过了什么,然后为这些添加了额外的测试。

+0

+1做得很好,先生 – annakata 2009-01-15 14:04:54

+0

如果你把猫C放在烤箱里会发生什么?怎么样放入一个“烧焦”的派,或者一个没有准备好烤箱的派?限制和无效输入测试很重要。 – Tester101 2009-01-15 14:16:12

0

我会为最独立/最低级别的功能构建一组单元。一旦你有这些类通过每一个测试,你可以继续前进,假设它们在被更多依赖的功能调用时会工作。

0

这些是一般准则我发现用于优先化单元测试有用:

1)确定边界的对象(赢/ WebForms的,CustomControls等)。

2)确定控制对象(业务层对象)

3)写单元测试只对控制对象由边界的对象调用的公共方法。这样你就可以确定你覆盖了你应用的主要功能。

你可以使用这些规则来优先考虑你的单元测试 - 然后如果你需要微测其他东西,你也可以根据你的需要来做。

1

当面对的测试列表来实现,你必须类别

  1. 微不足道的测试,但你确定你 可以完成这件事。
  2. 非平凡但 你有理由相信 完成它。
  3. 不平凡但 很难 - 绝对没有线索 完成它。

在这种情况下,从Category2存储桶中选择一个存储器,因为它将提供每单位投入时间的最大知识/学习。此外,它会让你滚动,并提高信心,以加速到更困难的Category3测试。

我想我是从TDD By Example得到这个 - Kent Beck。看看你是否有时间。推荐。

1

我一直在TDD上教授一堂课,现在有很多参与者开始测试所有的错误案例。尽管他们可能是相关的,但这不是启动imo的最佳方式。

从设置测试开始,这些测试很容易实现,并且仍然告诉您是否正在朝着正在尝试实现的功能的正确方向前进。因此,如果您正在构建堆栈,请确保在测试错误案例之前验证推送和弹出窗口。

请记住,测试的目标不仅是验证行为,还让您使用被测型的接口。如果编写测试感觉不对,您可能需要更改界面。

一个好主意是向后做每个测试用例。因此,从编写Assert语句开始。这是此测试验证的目标。然后添加必要的步骤以达到您可以执行Assert所做的操作。