【问题标题】:Should I only be testing public interfaces in BDD? (in general, and specifically in Ruby)我应该只在 BDD 中测试公共接口吗? (一般来说,特别是在 Ruby 中)
【发布时间】:2010-09-03 12:23:00
【问题描述】:

我正在阅读(仍然是测试版)rspec book by the prag progs,因为我对对象的行为测试很感兴趣。根据我目前收集到的信息(警告:仅阅读 30 分钟后),基本想法是我希望确保我的对象在“外部”(即在其输出中以及与其他对象的关系中)表现出预期的行为。

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

这可能是完全错误的,但考虑到我的对象在系统中的行为方式的所有焦点,似乎这是一个人会采取的意识形态。如果是这样,我们如何专注于对象的实现?如何测试我的私有方法对所有不同类型的输入执行我希望它执行的操作?

我想这个问题可能对所有类型的测试都有效??我对 TDD 和 BDD 还是很陌生。

【问题讨论】:

    标签: tdd rspec bdd


    【解决方案1】:

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

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

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

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

    如果它足够复杂以至于您确实想单独测试一些内部方法,请将它们分解为另一个类,然后说明为什么该类很有价值以及它对使用它的类做了什么。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      我认为这里有两个问题。

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

      第二个是如果你觉得需要测试私有方法,即使是在单元测试级别,那可能是你的代码违反了Single Responsibilty Principle 并且应该进行重构,以便您关心的方法可以作为不同类的公共方法进行测试。 Michael Feathers 最近对此进行了一次有趣的演讲,名为“The Deep Synergy Between Testability and Good Design”。

      【讨论】:

      • BDD 在单元级别(使用 RSpec,在 Ruby 中)以及验收测试级别(使用 Cucumber)工作。我倾向于通过将它们称为场景(验收测试)或示例(单元测试)来区分 Java / C# 世界。无论哪种方式,它们仍然应该是黑盒测试,但适用于不同的规模。如果您有兴趣,特征注入可以将 BDD 进一步带入分析领域......
      • 感谢 Liz 的澄清 - +1 的评论!我喜欢“场景”与“示例”的区别。我很想编辑我的回复以澄清我在谈论验收测试与单元测试,但是这个评论线程的其余部分将没有意义。我认为我的答案的第二部分在代码气味方面仍然非常有效。
      【解决方案3】:

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

      【讨论】:

      • 是的,我想到了它的整个 oo 范式。当然,能够在我们的类中进行检查是 ruby​​ 的一个特性(无论好坏),但大多数语言甚至不允许你这样做。
      猜你喜欢
      • 2012-02-22
      • 1970-01-01
      • 2011-01-24
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      相关资源
      最近更新 更多