摘要:是的單元測試框架。單元測試在軟件開發中越來越受到重視,測試先行編程極限編程和測試驅動開發在實踐中被廣泛。利用單元測試,也可以實現契約式設計。現在第二個測試也能通過啦你也可以使用契約式設計的風格,只需使用類提供的靜態斷言方法編寫契約條件。
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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...
閱讀 1982·2019-08-30 15:54
閱讀 3532·2019-08-30 15:52
閱讀 1822·2019-08-29 17:20
閱讀 2513·2019-08-29 17:08
閱讀 2346·2019-08-26 13:24
閱讀 780·2019-08-26 11:59
閱讀 2780·2019-08-23 14:50
閱讀 611·2019-08-23 14:20