为什么业务说"一切正确",代码却无法运行?
\n\n您是否遇到过这种情况:经理声称任务已完成,测试全部通过,但用户仍然不满意?经典场景。问题不在于代码——问题在于沟通。我们使用不同的语言:业务方使用场景,而开发人员使用方法与类。这时BDD(行为驱动开发)就派上了用场。而且,在PHP中它表现得非常出色。
\n\n在本文中,我们将探讨PHP中的BDD如何将模糊的"需求"转化为经理和程序员都能理解的清晰测试。您将了解BDD与普通TDD的区别,如何用Gherkin编写场景,以及哪些工具(Behat、PHPSpec)能真正简化工作。
\n\n简单来说,什么是BDD?
\n\nBDD(行为驱动开发)是TDD的演进。如果说TDD关注的是"如何测试代码",那么BDD回答的是"代码应该做什么才能让业务满意"。
\n\n想象一下,您正在编写一个在线商店。与其编写一个抽象的测试"applyDiscount()方法应该降低价格",不如编写一个场景:
\n\n- \n
- 给定:购物车中有价值1000卢布的商品 \n
- 当:用户输入促销代码"SALE10" \n
- 那么:购物车总价变为900卢布 \n
这个场景任何人都能读懂——从市场人员到技术负责人。没有魔法,只有系统行为。
\n\nBDD vs TDD:有什么区别?
\n\n很多人混淆这两个概念。让我们来澄清一下:
\n\n- \n
- TDD——先写测试,再写代码,然后重构。测试由开发人员为开发人员编写。 \n
- BDD——先用自然语言编写行为场景,然后将其自动化。场景是在与业务方对话中编写的。 \n
BDD并不取代TDD,而是对其补充。您仍然需要编写单元测试,但现在您有了以场景形式呈现的"活文档"。
\n\nPHP的BDD工具:选择武器
\n\nPHP生态系统为行为驱动开发提供了两个主要工具:Behat和PHPSpec。它们解决不同的问题。
\n\nBehat——全能战士
\n\nBehat是一个验收测试框架。它使用Gherkin语言(就是那个"给定-当-那么")。Behat非常适合集成测试、API检查、Web界面以及高层业务逻辑。
\n\nPHPSpec——开发者的显微镜
\n\nPHPSpec是一个用于类规范的工具。它更接近TDD,但带有BDD理念:您描述对象的行为,而不是其内部结构。PHPSpec非常适合领域逻辑的单元测试。
\n\n本文将重点介绍Behat,因为它最能说明PHP中的行为驱动开发。
\n\n使用Behat编写第一个PHP BDD场景
\n\n让我们创建一个真实示例。假设我们正在开发一个忠诚度系统。如果订单金额超过5000卢布,客户将获得10%的折扣。
\n\n步骤1:安装Behat
\n\ncomposer require --dev behat/behat\n\n然后初始化项目:
\n\nvendor/bin/behat --init\n\n目录结构如下:
\n\nfeatures/\n bootstrap/\n FeatureContext.php\n discount.feature\n\n步骤2:编写Gherkin特性文件
\n\n创建文件features/discount.feature:
Feature: 忠诚客户折扣计算\n As a 销售经理\n I want to 对5000卢布以上的订单提供10%折扣\n So that 鼓励大额购买\n\n Scenario: 订单超过折扣门槛\n Given 购物车中有价值6000卢布的商品\n When 我请求最终价格\n Then 最终价格应为