BDD - 规范示例

根据《实例需求说明》一书的作者 Gojko Adzic 的说法,实例需求说明是一组过程模式,可以促进软件产品的变更,以确保高效地交付正确的产品。"

示例规范是一种协作方法,用于定义软件产品的需求和面向业务的功能测试,其基础是使用实际示例而不是抽象语句来捕获和说明需求。

示例规范 - 概述

实例化需求说明的目标是专注于开发和交付优先化的、可验证的业务需求。 虽然示例需求说明的概念本身相对较新,但它只是对现有实践的改写。

它支持一种非常具体、简洁的词汇,称为通用语言, −

  • 启用可执行要求。

  • 由团队中的每个人使用。

  • 由跨职能团队创建。

  • 获得每个人的理解。

示例规范可以用作构建反映业务领域的自动化测试的直接输入。 因此,实例化需求说明的重点是构建正确的产品并构建正确的产品。

示例规范的目的

实例化需求说明的主要目的是构建正确的产品。 它注重共同理解,从而建立单一的事实来源。 它可以实现验收标准的自动化,以便重点关注缺陷预防而不是缺陷检测。 它还提倡尽早测试,尽早发现缺陷。

SbE 的使用

示例规范用于说明描述业务价值的预期系统行为。 说明是通过具体和现实生活中的例子来进行的。 这些示例用于创建可执行需求 −

  • 无需翻译即可测试。

  • 在实时文档中捕获。

以下是我们使用示例来描述特定规格的原因 −

  • 它们更容易理解。

  • 它们更难被误解。

SbE 的优势

使用示例需求说明的优点是 −

  • 提高质量

  • 减少浪费

  • 降低生产缺陷的风险

  • 集中精力

  • 可以更安全地进行更改

  • 提高业务参与度

SbE 的应用

示例规范在以下领域中查找应用 −

  • 复杂的业务或复杂的组织。

  • 对于纯粹的技术问题效果不佳。

  • 不适用于以 UI 为中心的软件产品。

  • 也可以应用于旧系统。

SbE 和验收测试

实例化需求说明在验收测试方面的优点是 −

  • 一张插图用于详细需求和测试

  • 项目的进展取决于验收测试−

    • 每个测试都是为了测试一种行为。

    • 测试要么通过某种行为,要么不通过。

    • 通过测试表示特定行为已完成。

    • 如果一个需要完成 100 个行为的项目完成了 60 个行为,那么它就完成了 60%。

  • 测试人员从缺陷修复转向缺陷预防,他们为解决方案的设计做出贡献。

  • 自动化可以立即了解需求变更对解决方案的影响。

示例规范 - 对于不同角色意味着什么

示例需求说明的目标是促进团队中每个人(包括整个项目中的客户)的协作,以交付业务价值。 为了更好地理解,每个人都使用相同的词汇。

角色 使用 SbE
业务分析师
  • 要求明确且没有功能差距。

  • 开发人员,请实际阅读规范。

开发者
  • 开发人员更好地了解正在开发的内容。

  • 通过计算已正确开发的规范,可以更好地跟踪开发进度。

测试人员
  • 测试人员更好地了解正在测试的内容。

  • 测试人员从一开始就参与其中,并在设计中发挥作用。

  • 测试人员致力于缺陷预防而不是缺陷检测。

所有人
  • 从一开始就识别错误可以节省时间。

  • 优质产品是从一开始就生产出来的。

SbE – 一组流程模式

正如我们在本章开头所看到的,示例需求说明被定义为一组过程模式,可促进软件产品的变更,以确保有效地交付正确的产品。

流程模式是 −

  • 协作规范

  • 使用示例说明规格

  • 完善规范

  • 自动化示例

  • 经常验证

  • 实时文档

协作规范

协作规范的目标是 −

  • 让团队中的不同角色达成共识并共享词汇。

  • 让每个人都参与到项目中,以便他们能够就某个功能贡献自己的不同观点。

  • 确保共享沟通和功能所有权。

这些目标是在规范研讨会(也称为"三个朋友会议")中实现的。 三个朋友是 BA、QA 和开发人员。 尽管项目中还有其他角色,但这三个角色将从定义到功能交付负责。

会议期间 −

  • 业务分析师 (BA) 提出新功能的要求和测试。

  • 三位好友(BA、开发人员和 QA)讨论新功能并审查规范。

  • QA 和开发人员还会识别缺失的需求。

  • 三位好友

    • 使用通用语言来利用共享模型。

    • 使用领域词汇(如果需要,可维护词汇表)。

    • 寻找差异和冲突。

  • 此时不要跳转到实现细节。

  • 就某个功能是否已充分指定达成共识。

  • 对需求和测试所有权的共同认识有助于制定质量规范

  • 需求以场景的形式呈现,提供了明确、明确的需求。 场景是从用户角度来看系统行为的示例。

使用示例说明规范

使用 Give-When-Then 结构指定场景以创建可测试的规范 −

Given <some precondition>

And <additional preconditions> Optional

When <an action/trigger occurs>

Then <some post condition>

And <additional post conditions> Optional

此规范是系统行为的示例。 它还代表了系统的验收标准。

团队讨论示例并合并反馈,直到就示例涵盖功能的预期行为达成一致。 这确保了良好的测试覆盖率。

完善规范

要完善规范,

  • 准确地书写示例。 如果示例变得复杂,请将其拆分为更简单的示例。

  • 关注业务角度并避免技术细节。

  • 同时考虑积极和消极条件。

  • 遵守领域特定词汇。

  • 与客户讨论示例。

    • 选择对话来完成此任务。

    • 仅考虑客户感兴趣的示例。这样可以仅生成所需的代码,并避免覆盖可能不需要的所有可能组合

  • 为了确保场景通过,该场景的所有测试用例都必须通过。 因此,增强规范以使其可测试。 测试用例可以包括各种范围和数据值(边界和极端情况)以及导致数据更改的不同业务规则。

  • 指定其他业务规则,例如复杂计算、数据操作/转换等。

  • 包含非功能性场景(例如性能、负载、可用性等)作为示例规范

自动化示例

自动化层需要保持非常简单——只需将规范连接到被测系统即可。 您可以使用工具来实现同样的目的。

使用领域特定语言 (DSL) 执行测试自动化,并显示输入和输出之间的清晰连接。 专注于规范,而不是脚本。 确保测试精确、易于理解和可测试。

经常验证

在每次更改(添加/修改)时,在开发管道中包含示例验证。 可以(并且应该)采用许多技术和工具来帮助确保产品的质量。 它们围绕三个关键原则 - 尽早测试、良好测试经常测试

经常执行测试,以便识别薄弱环节。 代表行为的示例有助于跟踪进度,只有在相应的测试通过后,行为才被称为完成。

实时文档

使规格尽可能简单和简短。 组织规范并随着工作的进展不断完善它们。 使团队中的所有人都可以访问文档。

示例流程步骤规范

插图显示了示例需求说明中的流程步骤。

生活文档

反模式

反模式是软件开发中的某些模式,被认为是不好的编程实践。 设计模式是解决常见问题的常用方法,已经被形式化,通常被认为是一种良好的开发实践,而反模式则相反,是不可取的

反模式会引起各种问题。

反模式 问题
无协作
  • 多种假设

  • 构建错误的东西

  • 测试错误

  • 不知道代码何时完成

不知道代码何时完成
  • 难以维护测试

  • 难以理解规范

  • 业务代表失去兴趣

过于详细或过于以 UI 为中心的示例
  • 难以维护测试

  • 规格难以理解

  • 业务代表失去兴趣

低估了所需的努力
  • 团队认为他们失败了并且很早就感到失望

问题的解决方案 - 质量

通过密切关注反模式可以确保质量。 为了最大限度地减少反模式造成的问题,您应该 −

  • 一起使用示例来指定。

  • 清理并改进示例。

  • 编写一段代码,满足示例

  • 自动化示例并部署。

  • 对每个用户故事重复该方法。

解决反模式带来的问题意味着坚持 −

  • 协作。

  • 专注于什么。

  • 专注于业务。

  • 做好准备。

让我们了解以上各项的含义。

协作

合作中 −

  • 业务人员、开发人员和测试人员从自己的角度提供意见。

  • 自动化示例证明团队构建了正确的东西。

  • 这个过程比测试本身更有价值。

关注什么

您必须关注"什么"这个问题。同时关注"什么" −

  • 不要试图涵盖所有可能的情况。

  • 不要忘记使用不同类型的测试。

  • 示例尽可能简单。

  • 示例应该易于系统用户理解。

  • 工具不应在研讨会中发挥重要作用。

专注于业务

专注于业务 −

  • 保持规范符合业务意图。

  • 让业务参与制定和审查规范。

  • 隐藏自动化层中的所有详细信息。

做好准备

做好以下准备 −

  • 即使团队做法发生改变,好处也不会立即显现出来。

  • 引入 SbE 具有挑战性。

  • 需要时间和投资。

  • 自动化测试并不是免费的。

工具

尽管实际上有多种工具可用,但示例规范并不强制使用工具。 有些案例即使不使用工具也能成功遵循示例需求说明。

以下工具支持示例说明 −

  • Cucumber

  • SpecFlow

  • Fitnesse

  • Jbehave

  • Concordion

  • Behat

  • Jasmine

  • Relish

  • Speclog