【问题标题】:How to create a Web Application from scratch using BDD?如何使用 BDD 从头开始​​创建 Web 应用程序?
【发布时间】:2017-07-29 10:12:48
【问题描述】:

我想开始一个宠物项目,以自信地从头开始创建 Web 应用程序,并且我想使用 BDD 和 TDD。 我在“成长中的面向对象软件:以测试为指导”中读到,我们应该从系统的最薄部分开始,这样我们就可以拥有整个应用程序的行走骨架,这样我们就可以快速获得反馈并开始思考生产/部署程序。

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

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

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

我故意忽略身份验证,以便我们可以专注于系统的主要功能。这个场景假设背后有一个工作的基础设施,所以上面的场景可以自动、端到端地复制。

假设我想在不同的层(Web 服务器、应用程序服务器和数据库)中布置 Web 应用程序,我该如何实现这个测试? 假设我想使用 Selenium WebDriver 来模拟用户,必须模拟哪些层以及首先要测试哪些层? 我也想过从只测试 API 开始,但这不会是端到端测试,但我们只会部分测试应用程序。

【问题讨论】:

    标签: testing web-applications tdd bdd


    【解决方案1】:

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

    在 API 级别编写一些应用程序 (BDD) 的 Cucumber 集成测试,描述高级功能。我不会在这个级别上模拟,因为您希望看到整个应用程序在这一点上运行。

    然后在您实现这些时,使用 TDD,在这里您需要模拟文件 IO/数据库等外部。一旦所有的 TDD 单元测试都完成了,整个特性就应该通过了。继续,直到完成所有功能。

    像这样继续下去,你就有了一套可靠的单元测试和一套可靠的 API 级别的集成(功能)测试。

    一旦完成(或并行获取垂直切片)使用“快乐的一天”场景硒测试启动 UI,这里真正需要测试的是 UI 代码,并且正确连接到应用程序,作为主要应用已经过良好测试。

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

    【讨论】:

    • 你会使用上面的API测试相同的场景吗?
    • 实际上是的。 API 使用集成和单元测试进行测试。如果在系统级别完成,其他 UI 测试也将触及 API
    【解决方案2】:

    我会为此使用 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 红/绿测试周期了。

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

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

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

    要使这一步正常工作,您必须与您的底层网络框架进行交互。一旦你让它工作,你就可以以最基本的形式进入下一步。

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

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

    祝你好运

    【讨论】:

    • 我得到了这个,我真的很感激这个答案,但我的问题是专门关于 Web 应用程序的,即测试应该从哪个层开始。我认为这是测试覆盖率、稳定性(因为端到端场景有点不稳定)和测试所经历的层之间的权衡。
    • 答案适用于 Web 应用程序(我现在写的就是它)。 BDD 不是关于测试,而是关于发现行为和推动开发,这意味着你必须在开始考虑覆盖和实施之前这样做。当您发现行为时,您应该从交互开始(在场景中是何时)。在 Web 应用程序中,这是用户和浏览器之间的交互(主要是)。所以你的“时间”应该使用浏览器。您的 Givens 可以更加灵活,并且可以在设置状态时绕过浏览器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多