如何使用 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(但我非常有偏见),我会首先围绕您的应用程序的核心部分编写一些场景。
编写场景时要遵循的一些重要规则
- 使用您的领域语言
- 只谈论你在做什么以及为什么它很重要
- 不要谈论你是如何做事的。
因此,对于您的超级英雄网站,您可以从考虑开始之前需要做的事情开始。
通常当您发现资源(超级英雄)时,您将有一些可以探索的基本 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_superhero
和 undefined constant batman
之类的错误。我们可以在步骤定义中使用辅助模块来解决这些问题。
module CreateSuperHeroStepHelper
def create_superhero(attrs={})
Superhero.create(attrs)
end
def batman
{
...
}
end
...
end
从这段代码开始,我们可以开始处理应用程序的域对象,例如超级英雄。
要使此步骤正常工作,您必须与底层 Web 框架进行交互。一旦您开始使用最基本的形式,您就可以进入下一步。
在此过程中,您将对接下来要做什么有各种各样的选择。如果你坚持在这个核心场景上工作,你就必须聪明地了解你如何实现这些事情。如果您决定处理看起来像先决条件的场景,例如用户帐户,创建超级英雄,输入您的超级英雄特征,添加超级英雄特征。然后,您应该最终获得可用于核心场景的工具(例如,您将拥有 create_superhero
),但需要更长的时间才能到达应用程序的核心。
这里不需要考虑单元测试、层或模拟。那是关于你如何做事的低级细节,这些细节要晚得多。只要您在 Web 框架方面具备一些基本能力,您就应该开始探索您的领域并使用 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(但我非常有偏见),我会首先围绕您的应用程序的核心部分编写一些场景。
编写场景时要遵循的一些重要规则
- 使用您的领域语言
- 只谈论你在做什么以及为什么它很重要
- 不要谈论你是如何做事的。
因此,对于您的超级英雄网站,您可以从考虑开始之前需要做的事情开始。
通常当您发现资源(超级英雄)时,您将有一些可以探索的基本 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_superhero
和 undefined constant batman
之类的错误。我们可以在步骤定义中使用辅助模块来解决这些问题。
module CreateSuperHeroStepHelper
def create_superhero(attrs={})
Superhero.create(attrs)
end
def batman
{
...
}
end
...
end
从这段代码开始,我们可以开始处理应用程序的域对象,例如超级英雄。
要使此步骤正常工作,您必须与底层 Web 框架进行交互。一旦您开始使用最基本的形式,您就可以进入下一步。
在此过程中,您将对接下来要做什么有各种各样的选择。如果你坚持在这个核心场景上工作,你就必须聪明地了解你如何实现这些事情。如果您决定处理看起来像先决条件的场景,例如用户帐户,创建超级英雄,输入您的超级英雄特征,添加超级英雄特征。然后,您应该最终获得可用于核心场景的工具(例如,您将拥有 create_superhero
),但需要更长的时间才能到达应用程序的核心。
这里不需要考虑单元测试、层或模拟。那是关于你如何做事的低级细节,这些细节要晚得多。只要您在 Web 框架方面具备一些基本能力,您就应该开始探索您的领域并使用 BDD 创建简单的工具,您可以使用这些工具来探索您的超级英雄世界。
祝你好运