composer create-project --prefer-dist laravel/laravel phpunit
目標:
使大家對於 PHPUnit 有基本的認識,並且完成第一個 function PHPUnit test
專案描述:
撰寫一個取出陣列中某個元素之前的所有元素的 function。例如:
$names = ['Taylor', 'Dayle', 'Matthew', 'Shawn', 'Neil'];
$result = array_until($names, 'Matthew');
var_dump($result);
/**
* array (
* 0 => 'Taylor',
* 1 => 'Dayle',
* )
*/
初始專案:
composer create-project --prefer-dist laravel/laravel phpunit
cd project
./vendor/bin/phpunit
{Project Path}/vendor/bin/phpunit
{Project Path}/phpunit.xml
{Project Path}/bootstrap/autoload.php
執行測試:
namespace Tests\Unit;
use Tests\TestCase;
class ArrayUntilTest extends TestCase
{
}
由於為 Laravel
專案,因此必須 use Test\TestCase
,底層為 Laravel 再包過一層自己的工具的版本。
// Laravel 的 PHPUnit 如下包裹:
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
}
use PHPUnit\Framework\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
}
public function testFetchesItemsInArrayUntilKey()
{
/** Arrange */
$names = ['Taylor', 'Dayle', 'Matthew', 'Shawn', 'Neil'];
/** Assume */
$expected = ['Taylor', 'Dayle'];
/** Act */
$result = array_until('Matthew', $names);
/** Assert */
$this->assertEquals($expected, $result);
}
function array_until(array $array, $search)
{
$position = array_search($search, $array);
if ($position == false) {
throw new InvalidArgumentException;
}
return array_slice($array, 0, $position);
}
/**
* @test
*/
public function testArrayUntilKeyDoesNotExistThrowException()
{
/** Arrange */
$names = ['Mark', 'Duncan', 'Erica', 'Fish'];
/** Assume */
$this->expectException(\InvalidArgumentException::class);
/** Act */
$actual = array_until($names, 'NotExist');
/** Assert */
}
if ($position == false) {
throw new InvalidArgumentException;
}
目標: 實作計算機的運算(加減乘除)等功能,採用 TDD 的方法。(範例參考來源:Laravel Testing Decoded by JeffreyWay / Ch5)
測試:新增驗證 Calculator 存在
實作:新增對應之 Class 使測試通過
測試:新增驗證 Result 預設為 0
實作:實現 calculator 之 Result 預設為 0
測試:新增 add 的 method 測試
實作:add method
測試:新增當遇到非數字時,應丟出 例外
實作:實作當輸入非數字時,丟出異常
測試:可以連加多筆數字
實作:連加多筆數字
測試:減法的 method
實作:減法並且可連減
重構:重構測試案例 萃取出 new Calculator 到 setUp method
重構:重構 production code 使 foreach 迴圈獨立到 calculateAll
當有測試案例保護時,進行比較大幅度的修改也相對的不會害怕