【问题标题】:Behavior Driven Development using existing software components使用现有软件组件的行为驱动开发
【发布时间】:2010-10-12 01:13:15
【问题描述】:

我目前正在阅读 The Rspec Book 的测试版:http://www.pragprog.com/titles/achbd/the-rspec-book

它将行为驱动的开发周期(红色、绿色、重构)描述为在开发过程中采取的小步骤。这意味着一次添加一个功能。

我的问题是:

如果我要描述我的软件的单个功能(例如:黄瓜测试中成功的用户登录场景)并且如果我使用具有许多功能(场景)的模块化组件(例如 Devise)。我怎么可能遵循行为驱动技术?一旦我的第一步通过,我必须对我的其他测试进行逆向工程以反映我正在使用的软件组件的功能,从而违反了 BDD 的原则!

编辑(为清楚起见):

我的第一个场景是在实施 Devise 之后通过。但是现在我必须将所有后续的端到端测试(我还没有编写)考虑到 Devise 的行为而不是我的利益相关者的要求。所以BDD循环不能再应用了。我必须在我的测试中对 Devise 进行逆向工程,以使它们通过或不编写测试。

【问题讨论】:

  • 我还是没听懂。如果(唯一的)利益相关者对 Devise 的功能不感兴趣,你为什么?如果他或她是,您为什么反对在端到端测试中考虑 Devise?不要挂断订单。你显然有一些代码。认为自己是红色的。重构以使场景和测试通过。有道理还是我完全错过了什么?
  • @user156011 我认为可能是我没有得到它。我会对 Devise 感兴趣,因为使用现有的、可靠的插件比自己构建所有东西要快。
  • 对。所以你确实使用Devise,但你从教条中放松了一点。您正在添加大量功能,并且您现有的测试可能会中断。这是好事。当您的测试失败时,可能是因为您添加了设计,然后您可以处理每个失败的示例,以确保它因正确的原因而失败并重写示例以使其通过。有意义吗?
  • 但是没有失败的测试。我有所有的绿色测试。但是为了获得良好的测试覆盖率,我必须围绕设计的功能编写所有未来的测试。这似乎适得其反,并没有真正遵循 BDD。你说得对,我应该放松一下:)

标签: ruby-on-rails rspec cucumber bdd devise


【解决方案1】:

BDD 循环涉及创建场景,然后围绕这些场景进行对话,以发现更多缺失的内容、任何误解等。

如果您使用像 Cucumber 这样的 BDD 工具,那么您可以捕获您讨论过的场景。

理想情况下,场景将采用高级步骤,重点关注系统的功能及其为用户提供的价值。它们与登录或身份验证失败无关。

BDD 并不是真正的测试。这是关于学习,让事情容易改变。如果您永远不会更改登录机制,那么手动验证身份验证就足够了。而是专注于使您的应用程序与所有其他应用程序不同的事情。您的软件如何真正提供价值?它如何与其他系统、应用程序和用户通信?如何赚钱、挽救生命或获得乐趣?

如果您能够回答这些问题并将步骤集中在这些问题上,那么即使使用 Devise,您仍然会遇到失败的情况。您的场景看起来更像:

Given I have registered an account
When I <do this differentiating thing>
Then I <achieve this differentiating outcome>

登录将是隐式的,并作为第一个 Given 的一部分作为较低级别的步骤调用。

【讨论】:

  • 我不同意。 BDD 仍然是关于软件开发,而不仅仅是商业价值。它推动开发并避免意外的功能损坏。
  • @collimarco BDD 一直以来都是关于编写重要的软件。如果您的软件没有推动商业价值,那也没关系。当然,上面的答案并不代表规范的 BDD,但根据我的经验,专注于差异化有助于人们理解为什么首先讨论场景是有用的。这是基于 9 年从事此类工作的经验,有时与 Dan North 并肩工作。
【解决方案2】:

所以我可以更好地理解:您有一个现有系统,它包括测试但不包括登录功能。您决定添加登录:

Given a visitor is not logged in
When a visitor goes to the admin page
Then the visitor should see the login page

好的,那么你决定如何实现登录,因为这个场景失败了。对?因此,您选择了 Devise,场景通过了,但所有依赖于无安全系统的测试或规范现在都失败了。我还在路上吗?如果是这种情况,您会遇到这样一种情况,即您正在添加一个在您的应用程序中如此普遍的功能,以至于您需要触及许多测试/规范才能让它们全部运行。您仍在首先进行测试,因为代码已损坏或测试无法识别新功能。无论如何,您都知道需要在哪里完成工作。

有用吗?

【讨论】:

  • 对不起,我说得不够清楚,但当然感谢您的帮助。我已经编辑了我原来的问题。这会让事情更清楚吗?
猜你喜欢
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2012-04-09
相关资源
最近更新 更多