PlusMagi's Blog By Pitt Phunsanit Backend PHP: การเขียน Unit Testing ด้วย PHPUnit

PHP: การเขียน Unit Testing ด้วย PHPUnit

ในฐานะ System Specialist และ Senior Architect การเขียนโค้ดที่ทำงานได้ (Functional) นั้นเป็นเพียงจุดเริ่มต้นเท่านั้น โค้ดระดับองค์กรที่แท้จริงต้องเป็นโค้ดที่สามารถบำรุงรักษาได้ (Maintainable) และเชื่อถือได้ (Reliable) ซึ่งหัวใจสำคัญที่ทำให้โค้ดมีคุณภาพสูงและทนทานต่อการเปลี่ยนแปลงคือการทำ Unit Testing

Unit Test คืออะไร? มันคือกระบวนการทดสอบส่วนประกอบย่อยที่สุดของระบบ (The smallest isolated unit of code) เช่น เมธอด (Method) หรือคลาสหนึ่งๆ โดยที่ Unit นั้นจะต้องถูกแยกออกจาก Dependencies ภายนอกทั้งหมด ไม่ว่าจะเป็นการเชื่อมต่อฐานข้อมูล (เช่น PostgreSQL), ระบบไฟล์, หรือ API ภายนอก เพื่อให้เรามั่นใจว่าเมื่อมีการเปลี่ยนแปลงโค้ดส่วนใด ส่วนอื่นจะไม่ล่มตามไปด้วย

PHPUnit: Framework มาตรฐานสำหรับการทดสอบ PHP

PHPUnit คือ Framework มาตรฐานที่ถูกออกแบบมาเพื่อรองรับการทำ Unit Testing ในภาษา PHP โดยเฉพาะ มันเป็นเครื่องมือที่ช่วยให้เราสามารถเขียน Test Case ได้อย่างมีโครงสร้างและรันการทดสอบทั้งหมดได้อย่างอัตโนมัติ แนวคิดหลักของการใช้ PHPUnit ไม่ใช่แค่การ ตรวจสอบว่าโค้ดทำงานได้ แต่คือการสร้าง Safety Net ให้กับโปรเจกต์ของเรา เมื่อใดก็ตามที่เราต้องการ Refactor โค้ด หรือเพิ่มฟีเจอร์ใหม่ เราเพียงแค่รัน Test Suite หากมี Unit ใดที่ล้มเหลว นั่นหมายความว่าเราได้ทำลาย Behavior เดิมของระบบไปแล้ว

หลักการทำงานและโครงสร้างการทดสอบ

การใช้ PHPUnit ที่ถูกต้องควรสอดคล้องกับหลักการ Test-Driven Development (TDD) ซึ่งเป็นแนวทางที่นักพัฒนาจะเขียน Test Case ก่อน จากนั้นจึงเขียนโค้ดจริงให้ผ่าน Test Case นั้นๆ การทดสอบที่ดีจะต้องมีการ Mocking Dependencies ภายนอกเสมอ เพื่อให้การทดสอบนั้นเป็นอิสระ (Isolated) อย่างแท้จริง

สมมติว่าเรามีคลาส Service ที่มีเมธอดคำนวณภาษี เราสามารถเขียน Test Case เพื่อตรวจสอบเมธอดนั้นได้ดังนี้:

PHP

// File: src/Service/TaxCalculator.php
class TaxCalculator {
    public function calculateTax(float $price): float {
        return $price * 0.07;
    }
}

// File: tests/TaxCalculatorTest.php
use PHPUnit\Framework\TestCase;

class TaxCalculatorTest extends TestCase {
    public function testCalculateTaxForStandardPrice() {
        $calculator = new TaxCalculator();
        // Test Case: ตรวจสอบการคำนวณภาษีมาตรฐาน
        $this->assertEquals(7.0, $calculator->calculateTax(100.0), "ควรคำนวณภาษีได้ 7.0");
    }

    public function testCalculateTaxForZeroPrice() {
        $calculator = new TaxCalculator();
        // Test Case: ตรวจสอบกรณีราคาสินค้าเป็นศูนย์
        $this->assertEquals(0.0, $calculator->calculateTax(0.0));
    }
}

บทสรุป: การยกระดับคุณภาพโค้ดด้วย Unit Testing

การผสาน Unit Testing เข้ากับ Workflow การพัฒนาจึงไม่ใช่ทางเลือก แต่เป็นมาตรฐานที่ Senior Developer ทุกคนต้องใช้ การใช้ PHPUnit อย่างเชี่ยวชาญช่วยให้เรามี Code Coverage ที่สูงขึ้น ลดโอกาสเกิด Bug ที่ซ่อนอยู่ และที่สำคัญที่สุดคือมันช่วยให้เรากล้าที่จะ Refactor โค้ดเดิมๆ ได้อย่างมั่นใจ โดยรู้ว่า Test Suite จะคอยจับตาดูพฤติกรรมเดิมของระบบให้เราเสมอ

Exit mobile version