ต่อจาก ตอนที่ 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 ประมาณนี้
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 จะพังทันที