PHP中的BDD:编写业务理解的代码

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么业务说"一切正确",代码却无法运行?

\n\n

您是否遇到过这种情况:经理声称任务已完成,测试全部通过,但用户仍然不满意?经典场景。问题不在于代码——问题在于沟通。我们使用不同的语言:业务方使用场景,而开发人员使用方法与类。这时BDD(行为驱动开发)就派上了用场。而且,在PHP中它表现得非常出色。

\n\n

在本文中,我们将探讨PHP中的BDD如何将模糊的"需求"转化为经理和程序员都能理解的清晰测试。您将了解BDD与普通TDD的区别,如何用Gherkin编写场景,以及哪些工具(Behat、PHPSpec)能真正简化工作。

\n\n

简单来说,什么是BDD?

\n\n

BDD(行为驱动开发)是TDD的演进。如果说TDD关注的是"如何测试代码",那么BDD回答的是"代码应该做什么才能让业务满意"。

\n\n

想象一下,您正在编写一个在线商店。与其编写一个抽象的测试"applyDiscount()方法应该降低价格",不如编写一个场景:

\n\n
    \n
  • 给定:购物车中有价值1000卢布的商品
  • \n
  • 当:用户输入促销代码"SALE10"
  • \n
  • 那么:购物车总价变为900卢布
  • \n
\n\n

这个场景任何人都能读懂——从市场人员到技术负责人。没有魔法,只有系统行为。

\n\n

BDD vs TDD:有什么区别?

\n\n

很多人混淆这两个概念。让我们来澄清一下:

\n\n
    \n
  • TDD——先写测试,再写代码,然后重构。测试由开发人员为开发人员编写。
  • \n
  • BDD——先用自然语言编写行为场景,然后将其自动化。场景是在与业务方对话中编写的。
  • \n
\n\n

BDD并不取代TDD,而是对其补充。您仍然需要编写单元测试,但现在您有了以场景形式呈现的"活文档"。

\n\n

PHP的BDD工具:选择武器

\n\n

PHP生态系统为行为驱动开发提供了两个主要工具:Behat和PHPSpec。它们解决不同的问题。

\n\n

Behat——全能战士

\n\n

Behat是一个验收测试框架。它使用Gherkin语言(就是那个"给定-当-那么")。Behat非常适合集成测试、API检查、Web界面以及高层业务逻辑。

\n\n

PHPSpec——开发者的显微镜

\n\n

PHPSpec是一个用于类规范的工具。它更接近TDD,但带有BDD理念:您描述对象的行为,而不是其内部结构。PHPSpec非常适合领域逻辑的单元测试。

\n\n

本文将重点介绍Behat,因为它最能说明PHP中的行为驱动开发。

\n\n

使用Behat编写第一个PHP BDD场景

\n\n

让我们创建一个真实示例。假设我们正在开发一个忠诚度系统。如果订单金额超过5000卢布,客户将获得10%的折扣。

\n\n

步骤1:安装Behat

\n\n
composer require --dev behat/behat
\n\n

然后初始化项目:

\n\n
vendor/bin/behat --init
\n\n

目录结构如下:

\n\n
features/\n  bootstrap/\n    FeatureContext.php\n  discount.feature
\n\n

步骤2:编写Gherkin特性文件

\n\n

创建文件features/discount.feature:

\n\n
Feature: 忠诚客户折扣计算\n  As a 销售经理\n  I want to 对5000卢布以上的订单提供10%折扣\n  So that 鼓励大额购买\n\n  Scenario: 订单超过折扣门槛\n    Given 购物车中有价值6000卢布的商品\n    When 我请求最终价格\n    Then 最终价格应为                

博客

书籍推荐