当前位置: 首页 > 质量专栏 > TDD 与 BDD:选择正确的框架
TDD 与 BDD:选择正确的框架
2021-07-15 浏览次数2699

在过去十年中,向Agile approach(敏捷方法)的转变对开发过程产生了巨大影响。许多组织正在转向Agile approach,因为它有助于以更快的速度交付优质产品。 持续测试现在已成为开发过程中不可或缺的一部分,而且这种变化将继续存在!因此,开发人员可以引入新的更改并防止错误(或故障)阻碍产品的可扩展性。

 使用敏捷开发过程的组织熟悉测试驱动开发(Test-Driven Development,TDD)和行为驱动开发 (Behavior-Driven Development ,BDD)。这些术语看起来确实是同义词,但彼此之间却大不相同。TDD 与 BDD 之间的博弈是可以理解的,因为这两种方法彼此截然不同。然而,这些过程在塑造开发工作方面发挥着重要作用。

 一、什么是测试驱动开发 (TDD)?

测试驱动开发或 TDD 是一种测试方法, QA工程师首先为每一分钟的功能编写测试。在设计和编写测试用例后,根据这些测试场景编写代码。

 起初,如果需要测试的底层功能没有准备好,测试可能会失败。然后,根据测试重构代码,直到它们通过。目的是代码应该保存 TDD 测试用例,如果无法做到这一点,我们再次重写代码。这使我们能够在一定程度上减少测试脚本中的重复实现。

 TDD 是一种测试优先的方法,它涉及基于预先指定的需求创建测试用例。然后修改代码以通过预先设计的测试。这形成一个循环,直到所有测试场景都通过。一旦所有测试用例都通过了,这意味着所有功能都可以使用而没有任何错误。

 

 

(一)TDD 的开发过程分为三个主要阶段:

 1.红色阶段:当需要开发一个功能单元时,我们需要将开发过程分解为更小的任务。以下是必须在红色阶段执行的步骤:

        (1)将软件功能定义为更小的单元,以便将开发单元分解为微小的功能。

        (2)为任务创建测试并编写测试,以便开发人员专注于功能的实现。保持测试设计超级简单和超级简约。

        (3)运行所有测试并检查新创建的测试场景是否失败。这是测试产品中新实现的功能所必需的。

 2.绿色阶段:在绿色阶段,我们为在红色阶段创建的小测试单元生成代码。以下是此阶段执行的主要步骤:

(1)为之前定义的测试用例编写简短的代码。

(2)通过运行测试来测试功能并验证它们是否通过(或失败)。

(3)再次运行所有测试用例并确保它们都通过。

 3.重构阶段:重构阶段用于保持所有测试的可操作性。这是通过以下方式确保的:

(1)通过消除所有问题来重构代码,从而确保所有测试都是可行的。

(2)改进测试代码而不添加任何新代码来测试更多功能。

(二)如何实施测试驱动开发 (TDD)

测试驱动的开发优先考虑测试而不是实现阶段。当所有测试都通过时,它标志着第一次迭代的结束。但是,如果必须实现更多功能,则必须通过新功能测试重复所有阶段。下图总结了TDD的流程:

 

(二)测试驱动开发 (TDD) 的优缺点

TDD 是一种测试优先的方法,通常在实现产品的实际功能之前编写自动化测试脚本。但是,TDD 有自己的优点和缺点。

 1.测试驱动开发 (TDD) 的优势

 (1)降低开发成本:TDD 中的开发过程被分成更小的块,以简化设计和开发早期阶段的问题检测。

(2)专注于设计和架构:在实现之前编写测试使开发过程更加无缝和高效。

(3)提高代码覆盖率:通过 TDD,一个设计良好的系统可以实现 100% 的代码覆盖率。

(4)代码可见性:编写测试以验证较小的功能,从而易于重构和维护代码。

(5)详细文档:由于测试是为验证微观功能而编写的,因此编写文档变得很容易。

 2.测试驱动开发 (TDD) 的缺点

 (1)导致错误代码的错误:测试可能包含错误,从而导致错误的实现。这可以通过使用正确的 BDD 框架、执行详细的代码审查等来避免。

(2)代价高昂的架构错误:如果生成的测试代码与所需的架构不符,可能会导致巨大的损失。

(3)开发缓慢:在代码开发之前创建测试用例会减慢产品开发速度。此外,由于当时没有实际实现,因此构建测试用例可能需要花费大量时间。

(4)需要先前的经验:必须具有 TDD 的先前经验,因为许多团队犯了没有在 Red Stage 运行测试的错误。

 二、什么是行为驱动开发 (BDD)

行为驱动开发或 BDD 是一种源自 TDD 的基于示例的方法。BDD 专注于开发和产品团队的开发人员和工程师之间的持续沟通和对软件产品的共同理解。这种理解是通过创建产品所需行为的场景来实现的。

 测试侧重于系统的行为,并根据这些行为预测开发功能。BDD 中最常用的方法是 given-when-then。例如,给定输入有效登录凭据的用户,下一步的预测是当用户通过单击登录按钮完成登录过程时,预期结果是显示验证消息。

 (一)以下是 BDD 的总体方法:

 (1)讨论功能:团队之间使用各种方法(例如 given-when-then 等)讨论该功能。

(2)写作场景:场景是使用 Gherkin 语言以纯文本形式编写的用户故事。Gherkin 允许分析师、开发人员等通过 given-when-then 格式描述场景。编写场景是为了以全面的方式描述功能的行为。

(3)代码开发:然后根据场景开发代码(或步骤)。这些场景充当验收测试,开发人员可以在其中为该特定功能开发代码。

(4)通过场景:这里,与 TDD 中相同,特定场景的代码应与为其做出的预测相同。验收测试试图检查并通过场景。

(5)代码重构:尽管场景清晰,但如果出现任何错误,QA 团队会重构代码。因此,测试人员通过重构来消除场景代码中的错误。

 (二)行为驱动开发 (BDD) 的优势

(1)改进沟通:创建场景需要客户、经理、开发人员、测试人员等之间的密切协调。这可以使团队统一理解产品行为。

(2)降低质量控制成本:自动化验收测试用于描述场景,这反过来有助于降低检查产品质量所涉及的成本。

(3)准确的任务估计:由于预期行为是之前预测的,因此几乎没有机会更改软件应用程序的架构。

(4)更好的用户体验:开发前编写的场景和测试都考虑了用户的角度。重点是期望的行为,而不是功能的实现。

 (三)行为驱动开发 (BDD) 的缺点

(1)比传统方法需要更多时间:对于团队而言,将所有人聚集在一起变得困难。此外,维护测试场景也需要更多的时间,这会导致额外的开销。

(2)产品开发缓慢:为了达成共识,管理、测试和开发团队必须协作。如果企业内部这些部门之间没有相互理解,BDD 适应就会变得缓慢。

(3)适合大型团队和不太复杂的项目:如果团队包括几个经常与测试人员和项目经理保持联系的开发人员,那么场景开发可能会产生额外的开销。在开发之前对 TDD 与 BDD 测试进行详细分析并开发测试用例对于较小的团队很有用。

(4)在项目开始时实施是必要的:在开发过程之间开发场景是没有意义的。这将降低效率并降低商业意义。此外,在遗留系统中改造场景几乎是不可能的。

 三、TDD 与 BDD – 哪种方法最适合你的项目?

从 TDD 与 BDD 的比较中可以看出,这两个框架各有优缺点。以下是在 TDD 与 BDD 之间进行选择时需要考虑的一些基本因素:

(1)团队的规模。

(2)软件产品的项目范围和复杂性。

(3)你在开发之前的优先事项(实施速度、开发时间、所需的测试覆盖率等)。

(4)团队和团队成员之间的沟通水平。

 TDD 与 BDD 是一场持续的战斗,应该探索两全其美以改善项目。以下要点强调了何时应使用 TDD 或 BDD:

 (1)TDD 适合任何项目:TDD 是一种通用方法。即使软件由一两个人设计、开发和测试,他们仍然可以实现 TDD。这种方法主要侧重于单元的质量。然而,TDD 并不能确保软件产品的行为正确,因为 TDD 不涉及开发过程中的利益相关者。

 (2)BDD 适用于大型团队:BDD 适合从事复杂项目的人员。这种方法记录了对产品行为的共同理解。对于专注于电子商务、移动应用程序、政府服务等中的用户操作的项目,BDD 是一种有用的项目方法。

 (3)BDD 适用于具有预测结果的产品:Given-when-then 方法假设在开发之前可以预测每个操作的结果。但是,如果项目基于人工智能或机器学习,则可以在学习过程中更改预测。因此, Then 参数将被更改,因为 Given 和 When 参数相同。因此,对于此类项目,不能使用 BDD。

 (4)现有系统的存在:在现有的遗留系统上工作时,最好采用 BDD,因为在开发过程中设计测试用例可能会导致许多错误和不一致。此外,在此类项目中,TDD 成为一项非常复杂的任务。

 

参考文章:https://www.lambdatest.com/blog/tdd-vs-bdd/


咨询软件测试