摘要:是的单元测试框架。单元测试在软件开发中越来越受到重视,测试先行编程极限编程和测试驱动开发在实践中被广泛。利用单元测试,也可以实现契约式设计。现在第二个测试也能通过啦你也可以使用契约式设计的风格,只需使用类提供的静态断言方法编写契约条件。
PHPUnit是PHP的单元测试框架。单元测试在软件开发中越来越受到重视,测试先行编程、极限编程和测试驱动开发在实践中被广泛。利用单元测试,也可以实现契约式设计。
接下来,我们通过一个例子说明如何利用PHPUnit来实践测试驱动开发。
假设我们需要编写一个银行账户的功能:BankAccount。该功能用于设置银行账户收支,存取现金,必须确保:
银行账户初始化时余额为0。
余额不能为负数。
在编写代码之前,我们先为BankAccout类编写测试:
require_once "BankAccount.php"; class BankAccountTest extends PHPUnit_Framework_TestCase { protected $ba; protected function setUp() { $this->ba = new BankAccount; } public function testBalanceIsInitiallyZero() { $this->assertEquals(0, $this->ba->getBalance()); } public function testBalanceCannotBecomeNegative() { try { $this->ba->withdrawMoney(1); } catch (BankAccountException $e) { $this->assertEquals(0, $this->ba->getBalance()); return; } $this->fail(); } public function testBalanceCannotBecomeNegative2() { try { $this->ba->depositMoney(-1); } catch (BankAccountException $e) { $this->assertEquals(0, $this->ba->getBalance()); return; } $this->fail(); } }
现在我们编写为了让第一个测试testBalanceIsInitiallyZero()通过所需要的代码:
class BankAccount { protected $balance = 0; public function getBalance() { return $this->balance; } }
现在第一个测试可以通过了,第二个还不行:
phpunit BankAccountTest PHPUnit 3.7.0 by Sebastian Bergmann. . Fatal error: Call to undefined method BankAccount::withdrawMoney()
为了让第二个测试通过,我们需要实现withdrawMoney()、depositMoney()和setBalance()方法。这些方法在违反约束条件时,会抛出一个BankAccountException。
class BankAccount { protected $balance = 0; public function getBalance() { return $this->balance; } protected function setBalance($balance) { if ($balance >= 0) { $this->balance = $balance; } else { throw new BankAccountException; } } public function depositMoney($balance) { $this->setBalance($this->getBalance() + $balance); return $this->getBalance(); } public function withdrawMoney($balance) { $this->setBalance($this->getBalance() - $balance); return $this->getBalance(); } }
现在第二个测试也能通过啦~
phpunit BankAccountTest PHPUnit 3.7.0 by Sebastian Bergmann. ... Time: 0 seconds OK (3 tests, 3 assertions)
你也可以使用契约式设计的风格,只需使用PHPUnit_Framework_Assert类提供的静态断言方法编写契约条件。下面例子中,如果断言不成立,就会抛出一个PHPUnit_Framework_AssertionFailedError。这种方式可以增加你的代码的可读性。但是这也意味着你需要PHPUnit会成为你的运行时依赖。
class BankAccount { private $balance = 0; public function getBalance() { return $this->balance; } protected function setBalance($balance) { PHPUnit_Framework_Assert::assertTrue($balance >= 0); $this->balance = $balance; } public function depositMoney($amount) { PHPUnit_Framework_Assert::assertTrue($amount >= 0); $this->setBalance($this->getBalance() + $amount); return $this->getBalance(); } public function withdrawMoney($amount) { PHPUnit_Framework_Assert::assertTrue($amount >= 0); PHPUnit_Framework_Assert::assertTrue($this->balance >= $amount); $this->setBalance($this->getBalance() - $amount); return $this->getBalance(); } }
原文 Test-Driven Development with PHPUnit
翻译 SegmentFault
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/20628.html
摘要:以前在学习开发时有专门写过的单元测试的文章,开发学习之单元测试,今天再总结下怎么在中使用单元测试。是一个用编程语言开发的开源软件,是一个单元测试框架。单元测试框架经常会包含每个测试的报告,以及给出你已经覆盖到的代码覆盖率。 以前在学习IOS开发时有专门写过Objective-C的单元测试的文章,IOS开发学习之单元测试,今天再总结下怎么在PHP中使用单元测试。 一、前言 在这篇文章中,...
摘要:另外一些单元测试可能会测试负向路径的场景,保证代码不仅会产生错误,而且是预期的错误。是一个面向程序员的测试框架,这是一个的体系结构的单元测试框架。 本系列教程所有的PHPUnit测试基于PHPUnit6.5.9版本,Lumen 5.5框架 前置 日常我们的普通用到的测试: 代码直接echo,debug等方法测试 -> 跟踪细节断点型测试 log日志辅助测试 -> 跟踪细节断点型测试 ...
摘要:另外一些单元测试可能会测试负向路径的场景,保证代码不仅会产生错误,而且是预期的错误。是一个面向程序员的测试框架,这是一个的体系结构的单元测试框架。 本系列教程所有的PHPUnit测试基于PHPUnit6.5.9版本,Lumen 5.5框架 前置 日常我们的普通用到的测试: 代码直接echo,debug等方法测试 -> 跟踪细节断点型测试 log日志辅助测试 -> 跟踪细节断点型测试 ...
摘要:配置执行程序点击那个同步的小图标,如果看到就说明配置有效指定模块配置选择,搜索,左侧选择,点击新增一个。 前言 如果你想做个接口测试,但并不想公开内部接口 如果你只是想对自己封装的某块代码做个小测试 如果你想要编写代码边调试,又不想操作 Postman 或前端的功能来调用 API 本文暂时仅介绍在 Laravel 和 Comoposer Library 项目中如何配置 PHPUni...
阅读 1964·2019-08-30 15:54
阅读 3515·2019-08-30 15:52
阅读 1809·2019-08-29 17:20
阅读 2468·2019-08-29 17:08
阅读 2325·2019-08-26 13:24
阅读 759·2019-08-26 11:59
阅读 2766·2019-08-23 14:50
阅读 593·2019-08-23 14:20