มาเล่น Laravel กัน – ตอนที่ 2: Test-driven development

ต่อจาก ตอนที่ 1: Installation

เราจะเริ่มเขียนโปรแกรมกับ Laravel กันแล้ว และเราก็จะเขียนแบบ TDD ด้วย คือเขียน Test ก่อน แล้วค่อยเขียน Code เพื่อให้ Test ผ่าน

โดย default แล้ว Laravel จะใช้ PHPUnit เป็น Unit Testing Framework โดยใน Laravel project จะมีไฟล์ phpunit.xml เตรียมมาให้ และ Test จะอยู่ใน app/tests โดยจะมีตัวอย่างไฟล์ชื่อ app/tests/ExampleTest.php มาให้ แล้วเราจะ TDD กับ Laravel ยังไง? ว่าแล้วก็ลุยกันเลย

1. Install PHPUnit:
ใช้คำสั่งดังต่อไปนี้

$ composer global require 'phpunit/phpunit=3.7.*'

จากนั้นกำหนด PATH เพิ่มเติมในไฟล์ ~/.bash_profile ดังนี้

export PATH=~/.composer/vendor/bin:$PATH

ทดสอบด้วยคำสั่งดังต่อไปนี้

$ phpunit --version
PHPUnit 3.7.28 by Sebastian Bergmann.

2. Run PHPUnit กับ Laravel
ใช้คำสั่งดังต่อไปนี้

$ cd /PATH_TO_YOUR_HTDOCS_DIR/mylaravel
$ phpunit

แล้วจะเห็น Test result ประมาณนี้
Screen Shot 2013-12-20 at 3.17.34 PM

3. Install guard/guard-shell:
guard/guard-shell เป็น ruby script ที่ช่วยในการทำ Continuous Testing คือคอย watch file changed แล้ว auto run Test ให้
ส่วนที่เลือก guard/guard-shell เพราะว่าเป็น Ruby ใช้ได้ทั้ง Mac และ Windows และไม่ยึดติดกับภาษา learning curve แทบจะไม่มี ศึกษาครั้งเดียวทำ TDD ได้กับทุกภาษา จะ run อะไรก็ได้ (ผ่าน shell) ส่วนการ install ก็ง่ายสุดๆ
ใช้คำสั่งดังต่อไปนี้

$ sudo gem install guard-shell

4. Config Guardfile:
Guardfile เป็น script ที่บอก guard ว่าจะ watch อะไร และเมื่อมีการเปลี่ยนแปลงให้ทำอะไร
ในการสร้าง Guardfile ใช้คำสั่งดังต่อไปนี้

$ cd /PATH_TO_YOUR_HTDOCS_DIR/mylaravel
$ guard init shell

จะเห็นว่ามีไฟล์ Guardfile เพิ่มเข้ามาใน project ให้เปิดไฟล์​ Guardfile แล้วแก้ไขดังนี้ เพื่อเป็นการ watch .php file และเมื่อมีการเปลี่ยนแปลง จะเรียก phpunit

guard :shell do
    watch(/(.*).php/) {|m| `phpunit` }
end

5. Run guard:
ใช้คำสั่งดังต่อไปนี้

$ cd /PATH_TO_YOUR_HTDOCS_DIR/mylaravel
$ guard
14:50:43 - INFO - Guard is using TerminalTitle to send notifications.
14:50:43 - INFO - Guard is now watching at '/PATH_TO_YOUR_HTDOCS_DIR/mylaravel'
[1] guard(main)>

6. ลองเพิ่ม Test Case:
เปิดไฟล์ app/tests/ExampleTest.php แล้วเพิ่ม code ดังนี้

public function testGamePage()
{
    $crawler = $this->client->request('GET', '/game');
 
    $this->assertTrue($this->client->getResponse()->isOk());
}

จะเห็นว่าพอ save file ปุ๊บ Test จะพังทันที

ตอนต่อไปเราจะมาดูกันว่า เราจะทำให้ Test ผ่านยังไง?
Screen Shot 2013-12-20 at 3.13.22 PM

One thought on “มาเล่น Laravel กัน – ตอนที่ 2: Test-driven development

Leave a Reply

Your email address will not be published. Required fields are marked *