当你提出一个关于系统某个部分应该如何工作的整体设计/想法时,你如何决定在做TDD时从哪里开始,或者更确切地说,你如何决定你的第一个测试?
答案 0 :(得分:7)
让我们假设我正在编写一个名为Oven
的类来烘焙我的美味Pie
对象。这就是我逐步完成单元测试的顺序:
Oven oven = new Oven();
没有测试。oven.turnOn(int degrees)
听起来不错,我会这样做的。我该如何检查?更好地制作oven.getTemperature()
。有一个明显的考验。Pie
。为此,我需要oven.bake(Pie p)
所以我会做到这一点。但现在呢?我想检查馅饼是否准备好了,而不是oven.isPieReady()
我认为oven.pastryStatus()
会返回“烤箱里没什么”,“生吃”,“差不多完成”,“煮熟”和“烧焦“听起来不错,一般来说应该比oven.isPieReady()
更容易扩展,所以我会这样做。依此类推。所以,我将按顺序进行测试,我希望使用对象来改进规范。最后,我通常会得到相当简单但功能强大的API,它可以满足我的需求。在我对我的API进行单元测试之后,我会对我的代码进行覆盖,以查看我错过的内容,然后为这些内容添加额外的测试。
答案 1 :(得分:1)
当面对要实施的测试列表时,您将拥有类别
在这种情况下,从Category2桶中选择一个,因为它将提供每单位投入时间的最大知识/学习。此外,它将让您滚动并增强信心,以适应更困难的Category3测试。
我想我是从TDD By Example得到的 - 肯特贝克。如果您有时间,请查看..推荐。
答案 2 :(得分:1)
我一直在TDD教授内部课程一段时间了,很多参与者都是通过测试所有错误案例开始的。尽管它们可能相关,但这不是启动imo的最佳方式。
首先设置易于实施的测试,并且仍然告诉您是否正朝着正在尝试实施的功能的方向前进。因此,如果您正在构建堆栈,请确保在测试错误情况之前验证推送和弹出。
请记住,测试的目标不仅是验证行为,还要让您使用被测类型的接口。如果编写测试错误,您可能需要更改界面。
一个好主意是向后做每个测试用例。所以首先编写Assert语句。这是此测试验证的目标。然后添加必要的步骤,以达到可以执行Assert所做的操作。
答案 3 :(得分:0)
我会为最独立/最低级别的功能构建一组单元。一旦你让这些类通过了每个测试,你就可以继续前进,假设它们在被更多依赖功能调用时会工作。
答案 4 :(得分:0)
这些是我认为对单元测试优先级有用的通用指南:
1)识别边界对象(Win / WebForms,CustomControls等)。
2)识别控制对象(业务层对象)
3)Write Unit仅测试边界对象调用的控制对象公共方法。这样您就可以确定自己正在涵盖应用程序的主要功能方面。
您可以使用这些规则来确定单元测试的优先级 - 然后,如果您需要对其他内容进行微测试,您也可以根据需要进行测试。