[PHPUNIT Best practices with Laravel วิธีเขียน unitTest V.1]


ก่อนลงมือเขียนโค๊ตตัวแรกควรคิดก่อนว่า "จะทดสอบโค๊ตนั้นอย่างไร" จริงไหม ถ้านั่นเป็นความจริงเราคงเลี่ยงไม่พ้นการสร้าง Testcase เพื่อทดสอบการทำงานของมัน และเพื่อให้มันครอบคลุมการทดสอบโค๊ตนั้น ๆ ก็ต้องเขียนทุกกรณี ไม่ใช่แค่กรณีที่ สำเร็จ ผิดพลาด หรืออื่น ๆ

เอาล่ะมาเริ่มกันเลยหากยังไม่ได้ทำการติดตั้ง PHPUNIT ก็ทำการติดตั้งให้เรียบร้อยครับผมได้เขียนไว้แล้วในบทความเก่าสามารถอ่านได้ แล้วหากยังไม่ได้ติดตั้ง Laravel ก็ติดตั้งให้เรียบร้อยซึ่งวิธีการก็ได้เขียนไว้แล้วในบทความที่ผ่านมา

เมื่อติดตั้ง phpunit & Larvel เสร็ดแล้วก็มาเริ่มกันเลย ผมจะลองสร้าง Controller ตัวหนึ่งขึ้นมาเพื่อทำงานบางอย่าง แล้วจะเขียน Unittest เพื่อทำการทดสอบมัน


โครงสร้างของไฟล์ Laravel unit Test จะอยู่ที่ Folder test ซึ่งจะรวบรวมเอาเคสทั้งหมดไว้ที่นี่ เช่น
Acceptance , Integration and unit ครับ ซึ่งจะถูก ควบคลุมด้วย config file ชือว่า phpunit.xml ซึ่งเราสามารถแก้ค่าต่าง ๆได้รายละเอียดค่อนข้างมากครับลองไปเปิดไฟล์ดู

PHPUnit  มีสิ่งที่ต้องคำนึงก่อนเขียนเล็กน้อยครับ

  1. สามารถ extends class TEST ได้เลยภายใน  Folder  Test ไม่ต้อง Use ก่อน
  2. มีฟังก์ชั่นพิเศษให้ใช้เช่น setUp() ; เป็นการเตียมค่าก่อนนำไปใช้งาน
  3. ต้องขึ้นต้องฟังก์ชั่นด้วยคำว่า test มันถึงจะรันให้
  4. สามารถ use class อื่น ๆ ได้ปรกติ
  5. ถ้าเป็นไปได้ควรเขียน  1 function ทำแค่เรื่องนั้นเรื่องเดียว อย่านำมายำรวมกัน
PHPUnit ฟังก์ชั่นพื้นฐาน
  • call
  • assertEquals
  • assertInternalType
  • assertObjectHasAttribute
  • assertTrue
  • assertFalse
  • assertNull
  • assertCount
สามารถอ่านเพิ่มเติมได้ที่ คู่มือphpunit
หลักการเบื้องต้นก็ประมาณนี้ครับเอาล่ะมาเริ่มเขียนก็เลย
class TestCaseValidate extends TestCase
{

    public $username = "test";
    public $password = "testpass";
    
    public function listTest()
    {

        return [
            'item' =>
                # get usage post.
                [
                    'url' => '/api/v1/check/test',
                    'code' => '400',
                    'message' => 'Bad Request',
                    'method' => 'GET',
                    'param' => [
                        'transaction_id' => '1453783608',
                        'service_number' => '08482848242',
                        'username' => $this->username,
                        'password' => $this->password,
                    ],
                ],

                # get usage pre.
                [
                    'url' => '/api/v1/check/test',
                    'code' => '200',
                    'message' => 'OK',
                    'method' => 'GET',
                    'param' => [
                        'transaction_id' => '1453783608',
                        'service_number' => '08482848242',
                        'username' => $this->username,
                        'password' => $this->password,
                    ],
                ],

                # Request Invalid.
                [
                    'url' => '/api/v1/check/test',
                    'code' => '400',
                    'message' => 'Bad Request',
                    'method' => 'GET',
                    'param' => [
                        'transaction_id' => '1453783608',
                        'service_number' => '',
                        'username' => $this->username,
                        'password' => $this->password,
                    ],
                ],

                #end array
            ]];
    }

    public function testCaseExcute()
    {
        $listTest = $this->listTest();
        foreach ($listTest['item'] as $key => $value) {
            $dataResult = $this->call($value['method'], $value['url'], $value['param']);
            $resultData = $dataResult->getData();
            $this->assertInternalType('object', $resultData);
            $this->assertObjectHasAttribute('header', $resultData);
            $this->assertObjectHasAttribute('transaction_id', $resultData);
            $this->assertEquals($resultData->header->code, $value['code']);
            $this->assertEquals($resultData->header->message, $value['message']);
            if ($resultData->header->code == 200) {
                $this->assertObjectHasAttribute('data', $resultData);
                $this->assertObjectHasAttribute('total', $resultData);
                $this->assertObjectHasAttribute('count_result', $resultData);
            }
        }
    }

}








Share on Google Plus

About maxcom

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 ความคิดเห็น:

แสดงความคิดเห็น