你会从哪个单元测试开始?

时间:2009-01-15 13:48:11

标签: language-agnostic testing tdd

当你提出一个关于系统某个部分应该如何工作的整体设计/想法时,你如何决定在做TDD时从哪里开始,或者更确切地说,你如何决定你的第一个测试?

5 个答案:

答案 0 :(得分: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()更容易扩展,所以我会这样做。
  4. 依此类推。所以,我将按顺序进行测试,我希望使用对象来改进规范。最后,我通常会得到相当简单但功能强大的API,它可以满足我的需求。在我对我的API进行单元测试之后,我会对我的代码进行覆盖,以查看我错过的内容,然后为这些内容添加额外的测试。

答案 1 :(得分:1)

当面对要实施的测试列表时,您将拥有类别

  1. 琐碎测试,但你确定你 可以做到这一点。
  2. 非平凡但是 你有充分的信心 完成它。
  3. 非平凡但是 困难 - 绝对没有任何线索 完成它。
  4. 在这种情况下,从Category2桶中选择一个,因为它将提供每单位投入时间的最大知识/学习。此外,它将让您滚动并增强信心,以适应更困难的Category3测试。

    我想我是从TDD By Example得到的 - 肯特贝克。如果您有时间,请查看..推荐。

答案 2 :(得分:1)

我一直在TDD教授内部课程一段时间了,很多参与者都是通过测试所有错误案例开始的。尽管它们可能相关,但这不是启动imo的最佳方式。

首先设置易于实施的测试,并且仍然告诉您是否正朝着正在尝试实施的功能的方向前进。因此,如果您正在构建堆栈,请确保在测试错误情况之前验证推送和弹出。

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这些是我认为对单元测试优先级有用的通用指南:

1)识别边界对象(Win / WebForms,CustomControls等)。

2)识别控制对象(业务层对象)

3)Write Unit仅测试边界对象调用的控制对象公共方法。这样您就可以确定自己正在涵盖应用程序的主要功能方面。

您可以使用这些规则来确定单元测试的优先级 - 然后,如果您需要对其他内容进行微测试,您也可以根据需要进行测试。