如何使用 BDD 从头开始​​创建 Web 应用程序?

How to create a Web Application from scratch using BDD?

我想开始一个宠物项目,以自信地从头开始创建 Web 应用程序,并且我想使用 BDD 和 TDD。 我在 "Growing Object-Oriented Software: Guided by Tests" 中读到,我们应该从系统的最薄部分开始,这样我们就可以拥有整个应用程序的行走骨架,这样我们就可以获得快速反馈并开始思考 production/deployment 过程.

在 BDD 中编写验收测试后,我将转向更细粒度的测试,例如单元测试。

假设Web应用程序是关于寻找与您更相似的超级英雄,我会编写一个BDD场景,例如:

When I insert my information
Then the system should tell that the superhero I'm more similar to is "Batman"

我故意忽略身份验证,以便我们可以专注于系统的主要功能。此场景假设背后有一个可用的基础架构,以便可以端到端地自动复制上述场景。

假设我想在不同的层(Web Server、Application Server 和 Database)布局 Web 应用程序,我该如何实现这个测试? 假设我想使用 Selenium WebDriver 来模拟用户,哪些层必须被模拟,哪些层将首先被测试? 我还考虑过只从测试 API 开始,但这不是端到端测试,但我们只会部分测试应用程序。

Cucumber 是一个很好的 BDD 框架。 UI/Selenium 测试可能有点古怪,所以我建议减少测试(参见测试金字塔)。 就我个人而言,我认为我会按照您为初学者建议的 API 级别工作,然后您已将 UI 与应用程序分离。

在 API 级别编写一些应用程序 (BDD) 的 Cucumber 集成测试,描述高级功能。我不会在这个级别上嘲笑,因为你想看到整个应用程序在这一点上工作。

然后当你实现这些时,使用 TDD,在这里你将想要模拟外部文件,如文件 IO/Database。完成所有 TDD 单元测试后,整个功能应该会通过。继续,直到完成所有功能。

像这样继续,然后您将在 API 级别获得一组可靠的单元测试和一组可靠的集成(功能)测试。

完成后(或并行获取垂直切片)使用 'happy day' 场景硒测试启动 UI,这里真正需要测试的是 UI 代码已正确连接到应用程序,因为主应用程序已经过良好测试。

只是我的看法 - 希望对您有所帮助。

我会为此使用 Cucumber(但我非常有偏见),我会首先围绕您的应用程序的核心部分编写一些场景。

编写场景时要遵循的一些重要规则

  1. 使用您的领域语言
  2. 只谈论你在做什么以及为什么它很重要
  3. 不要谈论你是如何做事的。

因此,对于您的超级英雄网站,您可以从考虑开始之前需要做的事情开始。

通常当您发现资源(超级英雄)时,您将有一些可以探索的基本 CRUD 操作,所以

  • 创造超级英雄
  • 编辑超级英雄
  • 删除超级英雄
  • 比较超级英雄 ** 这是你的关键起点 **

让我们开始比较超级英雄场景

Given there are superheroes Batman and Superman And I am like Batman When I find my superhero Then I should see I am like Batman

现在让我们开始实现这个场景。这里的一件重要事情是不要将所有代码都放在步骤定义中。而是将每个步骤定义为对辅助方法的调用。

注意:以下所有代码都是ruby

Given 'there are superheroes Batman and Superman' do create_superhero batman create_superhero superman end

现在我们可以进入 BDD red/green 测试周期了。

因此我们将开始收到 No method found create_superheroundefined constant batman 之类的错误。我们可以在步骤定义中使用辅助模块来解决这些问题。

module CreateSuperHeroStepHelper
  def create_superhero(attrs={})
    Superhero.create(attrs)
  end

  def batman
    {
      ...
    }
  end

  ...

end

从这段代码开始,我们可以开始处理应用程序的域对象,例如超级英雄。

要使此步骤正常工作,您必须与底层 Web 框架进行交互。一旦您开始使用最基本的形式,您就可以进入下一步。

在此过程中,您将对接下来要做什么有各种各样的选择。如果你坚持在这个核心场景上工作,你就必须聪明地了解你如何实现这些事情。如果您决定处理看起来像先决条件的场景,例如用户帐户,创建超级英雄,输入您的超级英雄特征,添加超级英雄特征。然后,您应该最终获得可用于核心场景的工具(例如,您将拥有 create_superhero),但需要更长的时间才能到达应用程序的核心。

这里不需要考虑单元测试、层或模拟。那是关于你如何做事的低级细节,这些细节要晚得多。只要您在 Web 框架方面具备一些基本能力,您就应该开始探索您的领域并使用 BDD 创建简单的工具,您可以使用这些工具来探索您的超级英雄世界。

祝你好运