본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

การเขียน Unit Tests ด้วย PHPUnit

บทความนี้แนะนำการเขียน Unit Tests ด้วย PHPUnit ซึ่งเป็นเครื่องมือยอดนิยมสำหรับการทดสอบโค้ด PHP โดยอธิบายถึงความสำคัญของการเขียน Unit Tests, วิธีการติดตั้งและใช้...

การเขียน Unit Tests ด้วย PHPUnit

ในบทเรียนก่อนหน้า เราได้เรียนรู้เกี่ยวกับการ Deploy PHP application ขึ้น Production Server ซึ่งเป็นขั้นตอนสำคัญในการนำ application ของเราไปใช้งานจริง แต่ก่อนที่เราจะมั่นใจว่า application ของเราทำงานได้อย่างถูกต้อง เราจำเป็นต้องทำการทดสอบ (Testing) อย่างละเอียดถี่ถ้วนเสียก่อน บทเรียนนี้จะแนะนำให้คุณรู้จักกับการเขียน Unit Tests ด้วย PHPUnit ซึ่งเป็นเครื่องมือยอดนิยมสำหรับการทดสอบโค้ด PHP

ทำไมต้องเขียน Unit Tests?

Unit Tests คือการทดสอบส่วนเล็กๆ ของโค้ด (Unit) โดยมุ่งเน้นไปที่การตรวจสอบว่าแต่ละ Unit ทำงานได้ตามที่คาดหวังหรือไม่ การเขียน Unit Tests มีประโยชน์มากมาย ดังนี้:

  • ค้นหาข้อผิดพลาดได้เร็ว: การทดสอบ Unit เล็กๆ ช่วยให้เราค้นหาข้อผิดพลาดได้ง่ายและรวดเร็ว
  • ปรับปรุงคุณภาพโค้ด: การเขียน Unit Tests บังคับให้เราคิดถึงการออกแบบโค้ดและ interface ของแต่ละ Unit อย่างรอบคอบ
  • ป้องกัน Regression: เมื่อมีการแก้ไขโค้ด การรัน Unit Tests จะช่วยให้เรามั่นใจได้ว่าการแก้ไขนั้นไม่ได้ทำให้เกิดข้อผิดพลาดใหม่ในส่วนอื่นๆ ของโค้ด
  • เอกสารประกอบโค้ด: Unit Tests สามารถใช้เป็นเอกสารประกอบโค้ดอย่างไม่เป็นทางการได้ โดยแสดงให้เห็นว่าแต่ละ Unit ควรทำงานอย่างไร
  • Refactoring อย่างมั่นใจ: การมี Unit Tests ที่ดีช่วยให้เราสามารถปรับปรุงโค้ด (Refactoring) ได้อย่างมั่นใจ โดยรู้ว่าหากการเปลี่ยนแปลงใดๆ ทำให้ Unit Tests ล้มเหลว เราจะรู้ได้ทันที

การเขียน Unit Tests อาจต้องใช้เวลาและความพยายาม แต่ผลตอบแทนที่ได้นั้นคุ้มค่าอย่างยิ่ง โดยเฉพาะอย่างยิ่งในโครงการขนาดใหญ่และมีความซับซ้อน

PHPUnit คืออะไร?

PHPUnit คือ framework สำหรับการเขียน Unit Tests ใน PHP ซึ่งได้รับความนิยมอย่างแพร่หลาย มีฟีเจอร์มากมายที่ช่วยให้การเขียน Unit Tests เป็นเรื่องง่ายและมีประสิทธิภาพ

การติดตั้ง PHPUnit

เราสามารถติดตั้ง PHPUnit ได้ง่ายๆ ผ่าน Composer ซึ่งเป็น dependency management tool ที่เราได้เรียนรู้ไปแล้วในบทก่อนๆ

composer require --dev phpunit/phpunit

คำสั่งนี้จะติดตั้ง PHPUnit ใน directory vendor/bin ของ project เรา หลังจากติดตั้งเสร็จสิ้น เราสามารถรัน PHPUnit ได้โดยใช้คำสั่ง:

./vendor/bin/phpunit

หรือถ้าต้องการรันจากที่ไหนก็ได้ในเครื่อง ให้เพิ่ม vendor/bin ไปใน PATH environment variable

การเขียน Test Cases

Test case คือ class ที่ประกอบด้วย test methods ซึ่งแต่ละ test method จะทำการทดสอบ Unit หนึ่งๆ

ตัวอย่าง: สมมติว่าเรามี class Calculator ที่มี method add สำหรับการบวกเลขสองจำนวน

// src/Calculator.php
class Calculator
{
    public function add(int $a, int $b): int
    {
        return $a + $b;
    }
}

เราสามารถสร้าง test case สำหรับ class Calculator ได้ดังนี้:

// tests/CalculatorTest.php
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase
{
    public function testAdd()
    {
        $calculator = new Calculator();
        $result = $calculator->add(2, 3);
        $this->assertEquals(5, $result);
    }
}

คำอธิบาย:

  • Test case class จะต้อง extends PHPUnit\Framework\TestCase
  • Test method จะต้องเริ่มต้นด้วยคำว่า test
  • ภายใน test method เราจะสร้าง instance ของ class ที่เราต้องการทดสอบ (Calculator)
  • เราจะเรียก method ที่เราต้องการทดสอบ (add)
  • เราจะใช้ assertion method (เช่น assertEquals) เพื่อตรวจสอบว่าผลลัพธ์ที่ได้เป็นไปตามที่คาดหวังหรือไม่

Assertions: PHPUnit มี assertion methods มากมายให้เราเลือกใช้ เช่น:

  • assertEquals($expected, $actual): ตรวจสอบว่าค่าสองค่าเท่ากัน
  • assertSame($expected, $actual): ตรวจสอบว่าค่าสองค่ามีชนิดข้อมูลและค่าเหมือนกัน
  • assertTrue($condition): ตรวจสอบว่า condition เป็น true
  • assertFalse($condition): ตรวจสอบว่า condition เป็น false
  • assertNull($value): ตรวจสอบว่า value เป็น null
  • assertNotNull($value): ตรวจสอบว่า value ไม่เป็น null
  • assertContains($needle, $haystack): ตรวจสอบว่า haystack มี needle อยู่
  • assertEmpty($value): ตรวจสอบว่า value เป็น empty
  • assertNotEmpty($value): ตรวจสอบว่า value ไม่เป็น empty
  • assertThrows(Exception::class, function() { ... }): ตรวจสอบว่า exception ถูก throw

การเลือกใช้ assertion method ที่เหมาะสมจะช่วยให้เราเขียน Unit Tests ที่ชัดเจนและอ่านง่าย

การ Running Tests

หลังจากที่เราเขียน test case แล้ว เราสามารถรัน test ได้โดยใช้คำสั่ง:

./vendor/bin/phpunit tests

โดย tests คือ directory ที่เก็บ test case files ของเรา

PHPUnit จะทำการรัน test cases ทั้งหมดใน directory tests และแสดงผลลัพธ์ให้เราทราบ

ผลลัพธ์: ผลลัพธ์ของการรัน tests จะแสดงให้เห็นว่า test cases ใดบ้างที่ผ่าน (passed) และ test cases ใดบ้างที่ล้มเหลว (failed) หากมี test case ใดล้มเหลว PHPUnit จะแสดงรายละเอียดของข้อผิดพลาดให้เราทราบ เพื่อให้เราสามารถแก้ไขโค้ดได้อย่างถูกต้อง

Test-Driven Development (TDD)

Test-Driven Development (TDD) คือแนวทางการพัฒนาซอฟต์แวร์ที่เน้นการเขียน Unit Tests ก่อนที่จะเขียนโค้ดจริง แนวทางนี้มีขั้นตอนดังนี้:

  1. เขียน Unit Test ที่ล้มเหลว (red)
  2. เขียนโค้ดให้น้อยที่สุดเพื่อให้ Unit Test ผ่าน (green)
  3. ปรับปรุงโค้ด (refactor) โดยไม่ทำให้ Unit Test ล้มเหลว (refactor)

การทำ TDD ช่วยให้เราเขียนโค้ดที่มีคุณภาพสูงและตรงตามความต้องการได้อย่างแม่นยำ

แนวปฏิบัติที่ดีในการเขียน Unit Tests

  • เขียน Unit Tests ที่ครอบคลุม: พยายามเขียน Unit Tests ให้ครอบคลุมทุกกรณีที่เป็นไปได้
  • เขียน Unit Tests ที่เป็นอิสระต่อกัน: Unit Tests แต่ละตัวควรเป็นอิสระต่อกัน เพื่อไม่ให้ test case หนึ่งล้มเหลวส่งผลกระทบต่อ test case อื่นๆ
  • ใช้ Mocks และ Stubs: หาก Unit ที่เราต้องการทดสอบมีการพึ่งพา dependencies ภายนอก ให้ใช้ Mocks และ Stubs เพื่อจำลอง dependencies เหล่านั้น
  • ตั้งชื่อ Test Methods ให้สื่อความหมาย: ชื่อ test method ควรสื่อความหมายถึงสิ่งที่ test method นั้นทำการทดสอบ
  • เขียน Assertions ที่ชัดเจน: ใช้ assertion method ที่เหมาะสมและเขียน assertions ที่ชัดเจน
  • รัน Unit Tests บ่อยๆ: รัน Unit Tests บ่อยๆ เพื่อให้มั่นใจว่าโค้ดของเรายังคงทำงานได้อย่างถูกต้อง

สรุป

การเขียน Unit Tests เป็นส่วนสำคัญของการพัฒนาซอฟต์แวร์ที่มีคุณภาพสูง PHPUnit เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการเขียน Unit Tests ใน PHP การเรียนรู้และฝึกฝนการเขียน Unit Tests จะช่วยให้คุณเป็นนักพัฒนา PHP ที่มีประสิทธิภาพมากยิ่งขึ้น ในบทเรียนต่อไป เราจะเรียนรู้เกี่ยวกับการใช้ Dependency Injection (DI) ใน PHP ซึ่งเป็นเทคนิคที่ช่วยให้โค้ดของเรามีความยืดหยุ่นและทดสอบได้ง่ายขึ้น

Office.in.th Custom Service

이 구조를 바탕으로 시스템을 개발하거나 맞춤 변경하고 싶으신가요?

Office.in.th는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기