BDD在PHP中:编写连项目经理都能理解的代码

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

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

开始课程

当代码用业务语言说话:初识BDD



想象一下这种情况:你从代码角度编写了一个完美的支付模块。所有方法都正常运行,异常得到处理,单元测试覆盖率达到99%。你正准备开香槟庆祝,但项目经理过来说:“为什么我们在订单确认之前就扣款了?”这时你意识到——问题不在代码,而在于对任务的理解。



熟悉吗?正是为了应对这种情况,才有了BDD(行为驱动开发)——一种由行为驱动的开发方式。这不仅仅是另一种方法论,而是连接“我希望它能工作”和“如何在PHP中实现它”之间的桥梁。如果你厌倦了每次需求澄清后都要重写逻辑,那么这篇文章就是为你准备的。



在本材料中,我们将探讨如何使用Behat框架在PHP中实施BDD,编写真实的测试,并理解为什么这能让代码更清晰、沟通更透明。



什么是BDD?它与TDD有何不同?



很多人将行为驱动开发与普通的TDD(测试驱动开发)混淆。确实,它们表面上看起来很相似:两者都是先编写测试。但区别在于关注点。



  • TDD 关注的是“如何验证函数返回正确的数字”。测试用程序员语言编写:assert、equals、mock。
  • BDD 关注的是“系统在特定业务场景中如何表现”。场景用自然语言(几乎是人类语言)编写。


PHP中BDD的核心思想是使用统一语言进行沟通。开发人员、测试人员和项目经理阅读同一个场景。如果场景中写着“用户未登录时添加商品到购物车”,那么所有人都能一致理解。



工具集:Behat和Gherkin



在PHP世界中,BDD的主要工具是Behat。这是一个解析Gherkin语言编写的场景并将其转换为可执行测试的框架。Gherkin是一种简单的英语(或俄语)语言,包含关键词:Feature、Scenario、Given、When、Then。



让我们将Behat安装到你的PHP项目中:



composer require --dev behat/behat behat/mink-extension behat/mink-goutte-driver


安装后,初始化项目:



vendor/bin/behat --init


目录结构如下:



features/  bootstrap/    FeatureContext.php  your_feature.featurebehat.yml


编写第一个PHP BDD场景



假设我们有一个在线商店。业务需求是:“已注册用户可以将商品添加到购物车并查看总金额”。创建文件features/cart.feature:



Feature: 购物车  作为已注册用户  我希望将商品添加到购物车  以便查看总价

Scenario: 添加一件商品 Given 我以用户 "ivan@example.com" 身份登录网站 And 在商品目录页上有一件商品 "笔记本电脑" 售价50000卢布 When 我点击商品 "笔记本电脑" 的 "添加到购物车" 按钮 Then 我看到消息 "商品已添加" And 购物车总金额为50000卢布


请注意:任何不懂PHP的项目经理都能读懂这个场景。但对Behat来说,这是一个可执行的测试。



步骤定义实现(Step Definitions)



现在需要“教会”Behat理解这些步骤。打开features/bootstrap/FeatureContext.php:



<?php

use Behat\\Behat\\Context\\Context;use Behat\\Gherkin\\Node\\PyStringNode;use Behat\\Gherkin\\Node\\TableNode;

class FeatureContext implements Context{ private $currentUser; private $cart = []; private $products = [];

/** * @Given 我以用户 :email 身份登录网站

博客

书籍推荐