引言:为什么你的代码值得尊重(以及测试)
\n\n想象一下:你编写代码,它运行正常,一切完美。但一个月后你回到项目,添加一个新功能——然后突然一切都崩溃了。熟悉吗?如果是这样,那么TDD在PHP中正是你所需要的。测试驱动开发(Test-Driven Development)不仅仅是一种流行趋势,更是一种改变对代码态度的哲学。在本文中,我们将探讨TDD如何将混乱变为秩序,将错误变为过去的遗迹。你将学习如何编写真正节省时间的PHP测试,并通过代码示例看到这一点。开始吧!
\n\n什么是TDD,为什么在PHP中需要它?
\n\nTDD在PHP中是一种方法论,你先编写测试,然后编写通过该测试的代码。听起来很奇怪?实际上这很天才。与其猜测你的代码是否有效,你获得即时反馈。TDD的基本原则:
\n\n- \n
- 红色 — 编写一个失败的测试(因为代码尚未编写)。 \n
- 绿色 — 编写最少的代码使测试通过。 \n
- 重构 — 在不破坏测试的情况下改进代码。 \n
这个循环一遍又一遍地重复。在PHP中,TDD特别有用,因为该语言常用于Web应用程序,错误可能代价高昂。基于PHPUnit(主要的测试框架)的测试有助于避免回归,并使代码透明。另外,TDD让你自律:你在编写代码之前就开始思考设计。
\n\n配置PHP测试环境
\n\n在深入示例之前,让我们准备好环境。对于PHP测试驱动开发,我们需要PHPUnit。安装很简单:
\n\ncomposer require --dev phpunit/phpunit ^10\n\n在项目根目录创建一个tests文件夹。在里面创建一个文件CalculatorTest.php。确保你安装了PHP 8.0+。现在一切就绪,可以进行第一个测试了。
第一个测试:用TDD编写计算器
\n\n让我们创建一个简单的计算器。首先是测试。这是一个经典的面向初学者的TDD PHP示例。
\n\n步骤1:红色(编写失败的测试)
\n\n创建tests/CalculatorTest.php:
<?php\n\nuse PHPUnit\\Framework\\TestCase;\n\nclass CalculatorTest extends TestCase\n{\n public function testAddition()\n {\n $calculator = new Calculator();\n $result = $calculator->add(2, 3);\n $this->assertEquals(5, $result);\n }\n}\n\n运行测试:
\n\n./vendor/bin/phpunit tests/CalculatorTest.php\n\n预期错误:Class "Calculator" not found。一切按计划进行——这是红色阶段。
步骤2:绿色(编写最少的代码)
\n\n创建src/Calculator.php:
<?php\n\nclass Calculator\n{\n public function add(int $a, int $b): int\n {\n return $a + $b;\n }\n}\n\n别忘了在测试中引入自动加载:
\n\nrequire_once __DIR__ . '/../src/Calculator.php';\n\n再次运行测试——绿色!现在进行重构。在这个阶段代码很简单,但稍后你可以改进它,而不必担心破坏它。
\n\n步骤3:充满信心地重构
\n\n假设我们想添加类型检查。修改代码:
\n\npublic function add(int $a, int $b): int\n{\n if (!is_int($a) || !is_int($b)) {\n throw new InvalidArgumentException('Only integers allowed');\n }\n return $a + $b;\n}\n\n运行测试——它们仍然通过。TDD让你有勇气进行实验。
\n\n高级TDD:处理异常和模拟
\n\n当你掌握了基础之后,转向复杂场景。例如,测试异常。在PHP单元测试中,这是