我应该只测试BDD中的公共接口吗? (一般来说,特别是在Ruby中)

时间:2010-09-03 12:23:01

标签: tdd rspec bdd

我正在阅读(仍然是测试版)rspec book by the prag progs因为我对对象的行为测试感兴趣。从我迄今为止所收集到的内容(警告:仅读取30分钟后),基本思想是我希望确保我的对象在外部表现为“外部”,即在其输出中以及与其他对象相关的行为。

那么我应该只是对我的对象进行黑盒测试以确保与其他对象的正确输出/交互吗?

这可能是完全错误的,但考虑到我的对象在系统中的行为方式,所以这似乎是一种意识形态。如果是这样,我们如何专注于对象的实现?我如何测试我的私有方法正在做我想要它做的所有不同类型的输入?

我想这个问题可能适用于所有类型的测试?我还是TDD和BDD的新手。

3 个答案:

答案 0 :(得分:10)

如果您想更好地了解BDD,请尝试在不使用“test”一词的情况下考虑它。

不是编写测试,而是编写一个如何使用类的示例(除非通过公共方法,否则不能使用它)。您将展示为什么您的课程对其他课程有价值。您正在定义班级职责的范围,同时(通过模拟)显示在其他地方委派的职责。

同时,您可以质疑责任是否合适,并调整课程中的方法以尽可能直观地使用。您正在寻找易于理解和使用的代码,而不是易于编写的代码。

如果您可以根据示例进行思考并通过行为提供价值,那么您将创建易于使用的代码,并提供其他人可以遵循的示例和说明。您将使您的代码安全且易于更改。如果你考虑测试,你会把它固定下来,以便没有人可以打破它。你会很难改变。

如果它足够复杂,你需要单独测试内部方法,将它们分成另一个类,然后说明为什么该类有价值以及它对使用它的类有什么作用。

希望这有帮助!

答案 1 :(得分:2)

我认为这里有两个问题。

一个是从BDD的角度来看,您通常在比TDD角度更高的级别进行测试。因此,您的BDD测试将声明比TDD测试更大的功能,并且应始终是“黑盒”测试。

第二个问题是,如果您觉得需要测试私有方法,即使在单元测试级别,也可能是代码异味,而您的代码违反了Single Responsibilty Principle  并且应该重构,以便您关心的方法可以作为不同类的公共方法进行测试。迈克尔·费瑟斯(Michael Feathers)最近对此进行了一次有趣的讨论,名为“The Deep Synergy Between Testability and Good Design。”

答案 2 :(得分:1)

是的,专注于该类的公开功能。私有方法只是您要测试的公共函数的一部分。这一点有点争议,但在我看来,应该足以测试一个类的公共功能(其他一切也违反了OOP原则)。