摘要:是的單元測試框架。單元測試在軟件開發(fā)中越來越受到重視,測試先行編程極限編程和測試驅(qū)動開發(fā)在實踐中被廣泛。利用單元測試,也可以實現(xiàn)契約式設(shè)計?,F(xiàn)在第二個測試也能通過啦你也可以使用契約式設(shè)計的風(fēng)格,只需使用類提供的靜態(tài)斷言方法編寫契約條件。
PHPUnit是PHP的單元測試框架。單元測試在軟件開發(fā)中越來越受到重視,測試先行編程、極限編程和測試驅(qū)動開發(fā)在實踐中被廣泛。利用單元測試,也可以實現(xiàn)契約式設(shè)計。
接下來,我們通過一個例子說明如何利用PHPUnit來實踐測試驅(qū)動開發(fā)。
假設(shè)我們需要編寫一個銀行賬戶的功能:BankAccount。該功能用于設(shè)置銀行賬戶收支,存取現(xiàn)金,必須確保:
銀行賬戶初始化時余額為0。
余額不能為負(fù)數(shù)。
在編寫代碼之前,我們先為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(); } }
現(xiàn)在我們編寫為了讓第一個測試testBalanceIsInitiallyZero()通過所需要的代碼:
class BankAccount { protected $balance = 0; public function getBalance() { return $this->balance; } }
現(xiàn)在第一個測試可以通過了,第二個還不行:
phpunit BankAccountTest PHPUnit 3.7.0 by Sebastian Bergmann. . Fatal error: Call to undefined method BankAccount::withdrawMoney()
為了讓第二個測試通過,我們需要實現(xiàn)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(); } }
現(xiàn)在第二個測試也能通過啦~
phpunit BankAccountTest PHPUnit 3.7.0 by Sebastian Bergmann. ... Time: 0 seconds OK (3 tests, 3 assertions)
你也可以使用契約式設(shè)計的風(fēng)格,只需使用PHPUnit_Framework_Assert類提供的靜態(tài)斷言方法編寫契約條件。下面例子中,如果斷言不成立,就會拋出一個PHPUnit_Framework_AssertionFailedError。這種方式可以增加你的代碼的可讀性。但是這也意味著你需要PHPUnit會成為你的運(yùn)行時依賴。
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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/20628.html
摘要:以前在學(xué)習(xí)開發(fā)時有專門寫過的單元測試的文章,開發(fā)學(xué)習(xí)之單元測試,今天再總結(jié)下怎么在中使用單元測試。是一個用編程語言開發(fā)的開源軟件,是一個單元測試框架。單元測試框架經(jīng)常會包含每個測試的報告,以及給出你已經(jīng)覆蓋到的代碼覆蓋率。 以前在學(xué)習(xí)IOS開發(fā)時有專門寫過Objective-C的單元測試的文章,IOS開發(fā)學(xué)習(xí)之單元測試,今天再總結(jié)下怎么在PHP中使用單元測試。 一、前言 在這篇文章中,...
摘要:另外一些單元測試可能會測試負(fù)向路徑的場景,保證代碼不僅會產(chǎn)生錯誤,而且是預(yù)期的錯誤。是一個面向程序員的測試框架,這是一個的體系結(jié)構(gòu)的單元測試框架。 本系列教程所有的PHPUnit測試基于PHPUnit6.5.9版本,Lumen 5.5框架 前置 日常我們的普通用到的測試: 代碼直接echo,debug等方法測試 -> 跟蹤細(xì)節(jié)斷點型測試 log日志輔助測試 -> 跟蹤細(xì)節(jié)斷點型測試 ...
摘要:另外一些單元測試可能會測試負(fù)向路徑的場景,保證代碼不僅會產(chǎn)生錯誤,而且是預(yù)期的錯誤。是一個面向程序員的測試框架,這是一個的體系結(jié)構(gòu)的單元測試框架。 本系列教程所有的PHPUnit測試基于PHPUnit6.5.9版本,Lumen 5.5框架 前置 日常我們的普通用到的測試: 代碼直接echo,debug等方法測試 -> 跟蹤細(xì)節(jié)斷點型測試 log日志輔助測試 -> 跟蹤細(xì)節(jié)斷點型測試 ...
摘要:配置執(zhí)行程序點擊那個同步的小圖標(biāo),如果看到就說明配置有效指定模塊配置選擇,搜索,左側(cè)選擇,點擊新增一個。 前言 如果你想做個接口測試,但并不想公開內(nèi)部接口 如果你只是想對自己封裝的某塊代碼做個小測試 如果你想要編寫代碼邊調(diào)試,又不想操作 Postman 或前端的功能來調(diào)用 API 本文暫時僅介紹在 Laravel 和 Comoposer Library 項目中如何配置 PHPUni...
閱讀 1995·2019-08-30 15:54
閱讀 3543·2019-08-30 15:52
閱讀 1832·2019-08-29 17:20
閱讀 2527·2019-08-29 17:08
閱讀 2354·2019-08-26 13:24
閱讀 799·2019-08-26 11:59
閱讀 2788·2019-08-23 14:50
閱讀 623·2019-08-23 14:20