Day 23 - PHPunit 新手村

Laradebut #8: PHPUnit 新手村

導讀者: Mouson(陳佑竹)
Laradebut #8: PHPUnit 新手村 - HackMD - https://hackmd.io/s/Sk4xL6jAe
GitHub: https://github.com/mouson/laradebut8_phpunit_demo


測試最小單位的邏輯
測試裡面, 不寫邏輯 ex. if else
不依賴外面不可控的環境
測試案例盡可能彼此之間獨立
測試只測一件事



Fast:快速。可以很快看到結果。
Independent:獨立。測試案例之間不互相影響。
Repeatable:可重複。可重複執行而不影響預期結果。
Self-Validating:不需要人工介入驗證。
Timely:及時。程式完成即可立刻驗證。


三A原則

Arrange : 初始化目標物件、相依物件、方法參數、預期結果,或是預期與相依物件的互動方式。
Assume:預期結果、或預期的互動
Act : 呼叫目標物件的方法。
Assert : 驗證是否符合預期。

TDD

紅燈 -> 綠燈 -> 重構


練習

laravel5.3 本身就有含PHPunti

  • Cli 輸入跑測試指令

    cd project
    ./vendor/bin/phpunit
    

    第一次應該會像這樣

  • 建立練習測試用資料夾與檔案

  • 增加autoload聯繫

輸入指令

composer dump-autoload
  • 建立測試
<?php
//使用要測試的class
use App\Test\helper;

/**
*簡單字串測試
*/
class ClassName extends TestCase
{
    //每次要開始載入
    protected function setUp()
    {
        $this->help = new helper;
    }

    public function testArrayUntil()
    {
        /** Arrange 初始化目標物件、相依物件、方法參數、預期結果,或是預期與相依物件的互動方式。*/
        $names = ['Taylor', 'Dayle', 'Matthew', 'Shawn', 'Neil'];

        /** Assume 預期結果、或預期的互動*/
        $expected = ['Taylor', 'Dayle'];

        /** Act 呼叫目標物件的方法*/
        $result =  $this->help->array_until($names, 'Matthew');

        /** Assert 驗證是否符合預期*/
        $this->assertEquals($expected, $result);
    }
}
?>
  • 先跑一次測試, 因為還沒實作主程式所以會報錯

  • 實作主程式
<?php
namespace App\Test;

use InvalidArgumentException;

class helper
{
    public function array_until(array $array, $search)
    {
        $position = array_search($search, $array);
        if ( $position == false ) {
            throw new InvalidArgumentException('not find');
        }

        return array_slice($array, 0, $position);
    }
}
?>
  • 再跑一次測試 當有符合預期結果, 測試就會通過

非預期結果, ex: 找不到輸入字串jack (行數10)

    public function testArrayUntil()
    {
        /** Arrange 初始化目標物件、相依物件、方法參數、預期結果,或是預期與相依物件的互動方式。*/
        $names = ['Taylor', 'Dayle', 'Matthew', 'Shawn', 'Neil'];

        /** Assume 預期結果、或預期的互動*/
        $expected = ['Taylor', 'Dayle'];

        /** Act 呼叫目標物件的方法*/
        $result =  $this->help->array_until($names, 'jack');//jack 不存在

        /** Assert 驗證是否符合預期*/
        $this->assertEquals($expected, $result);
    }


參閱

如何在Laravel 4.2使用PHPUnit?
http://oomusou.io/laravel/laravel42/laravel-42-phpunit/
Laradebut #8: PHPUnit 新手村
https://hackmd.io/s/Sk4xL6jAe


補一下上新手村所學到的東西, 主要是用直接用PHPUnit實做測試, 還有些實作部分沒記錄上來, 跟Laravel內建的測試使用方式有許些不同, 要再多練習phpunti, 之後研究Laravel到底該怎麼實作。

#講者好厲害
#PHPstorm超屌
#第一次寫測試
#還要多多練習
#重構好厲害
#物件導向的繼承, 多型真好用
#昨日Docker 崩壞, 已救援

留言