PHPUnit從零開始(2):編寫 PHPUnit 測試
計劃永遠趕不上變化,本計劃本月完成所有PHPUnit的部落格內容。今天一看日曆發現都TMD的二月底了,而我才寫了一篇而已。情何以堪……
今天寫第二篇,詳細說一說如何寫出一個測試用例。
這裡會涉及到一些什麼自動載入之類的,我就不再這裡補充了,大家可以查閱相關PHP自動載入的資料。
首先我的專案結構如下:
+phpunit // 專案名稱
+src // 存放專案程式碼,需要測試的程式碼
+tests // 測試使用者存在目錄
+vendor // composer生成的目錄,存放的第三方包
composer.json // composer需要的配置檔案
index.php // 入口檔案,主要涉及自動載入相關程式碼
phpunit.xml // 測試用例的配置檔案
這裡每一個資料夾及檔案的大體情況如上,現在在我的src目錄下有一個檔案,名字:Money.php
<?php
namespace Src;
/**
* @author: helei
* @createTime: 2016-01-07 17:45
* @description:
*/
class Money
{
private $amount;
public function __construct($amount)
{
$this->amount = $amount;
}
public function getAmount ()
{
return $this->amount;
}
public function negate()
{
return new Money(-1 * $this->amount);
}
}
當你想把一些東西寫到 print 語句或者調試表達式中時,別這麼做,將其寫成一個測試來代替。 –Martin Fowler
這是程式設計大牛們的說的話,要我說:如果你想要測試一個方法內部邏輯是否正確,那麼就寫一個測試用例,測試一下這個方法,給他一個值,看看他輸出的結果是否是預期的值。
OK,現在具體到我這個方法,我要測試Money這個類,我給他初始化時,輸入1,經過Money::multiple()方法翻倍後,他的值應該是:2,然後通過Money::getAmount()獲取翻倍後的值,與2進行比較,通過斷言檢查是不是2.
那麼以上是測試用例要驗證的東西,具體到實際的編碼,在 tests
<?php
namespace Tests;
use Src\Money;
/**
* @author: helei
* @createTime: 2016-01-07 17:47
* @description:
*/
class MoneyTest extends \PHPUnit_Framework_TestCase
{
public function testCanBeNegated()
{
// Arrange
$a = new Money(1);
// Act
$b = $a->multiple();
// Assert
$this->assertEquals(2, $b->getAmount());
}
}
現在所有的程式碼寫完了,到了使用測試用例的時候了。這裡有必要給個輔助資料,通過這個官方的文件,可以詳細瞭解各個命令的使用。後面我用到的所有命令都不做解釋了哈,不明白的請移動這裡檢視。
在cmd命令列,進入到專案所在目錄,操作如下圖。
正確的情況:
.
當測試成功時輸出。
F
當測試方法執行過程中一個斷言失敗時輸出。
E
當測試方法執行過程中產生一個錯誤時輸出。
R
當測試被標記為有風險時輸出。
S
當測試被跳過時輸出。
I
當測試被標記為不完整或未實現時輸出。
通過觀察,可以發現,命令列輸出的是一個 · ,代表Money這個類,輸出了我們預期的結果。通過了測試。
大家可以在斷言處,把各種相應的值進行修改,然後看看輸出的結果。
寫著寫著,發現PHPUnit的基礎知識也就這麼點,後面的好像可寫可不寫似的,因為在官方文件中都寫的清清楚楚了,我都不好意思再把文件抄過來一遍,然後寫個 原創。
耶,那我如果不寫了,那不是就完成了PHPUnit的部落格內容了嗎?哈哈,好吧,完成2016第一件任務,學完phpunit以及相關部落格。接下來會開始設計模式的相關寫作,並且會同步github了。
愛好學習與寫作的朋友們,千萬別跟我醬紫,明明還可以寫個五篇七篇的,就兩篇然後戛然而止了。當然如果還有不明白的地方,可以留言提問,我後面再補充幾篇也無不可。