PlusMagi's Blog By Pitt Phunsanit Backend,Database Clean Architecture: Testing Pyramid

Clean Architecture: Testing Pyramid

ในโลกของการพัฒนาซอฟต์แวร์ที่ซับซ้อน การรับประกันคุณภาพ (Quality Assurance) คือหัวใจสำคัญของระบบที่เสถียร Clean Architecture และ Testing Pyramid คือสองแนวคิดที่มาบรรจบกันเพื่อสร้างรากฐานการทดสอบที่แข็งแกร่ง โดยเฉพาะเมื่อเราใช้ PostgreSQL เป็นระบบจัดการฐานข้อมูลหลัก บทความนี้จะเจาะลึกว่าเราจะนำหลักการเหล่านี้มาปรับใช้เพื่อสร้างโค้ดที่ทดสอบได้ง่าย (Testable) และเชื่อถือได้ได้อย่างไร

Understanding Clean Architecture และ Testing Pyramid

Clean Architecture คือแนวทางที่เน้นการแยกความรับผิดชอบ (Separation of Concerns) ออกจากกันอย่างชัดเจน ทำให้แกนหลักของแอปพลิเคชัน (Domain Logic) ไม่ขึ้นอยู่กับรายละเอียดของเทคโนโลยีภายนอก เช่น ฐานข้อมูล (PostgreSQL), UI, หรือเฟรมเวิร์กต่างๆ

ในขณะที่ Testing Pyramid เป็นแนวคิดที่แนะนำว่าการทดสอบควรเน้นที่ระดับล่างสุดก่อน นั่นคือ Unit Tests (การทดสอบหน่วยย่อย) ซึ่งรวดเร็วและถูกที่สุด ตามด้วย Integration Tests (การทดสอบการรวมระบบ) และปิดท้ายด้วย End-to-End Tests (การทดสอบระบบทั้งหมด) ซึ่งช้าและควรมีจำนวนน้อยที่สุด

การประยุกต์ใช้กับ PostgreSQL: การทดสอบในระดับหน่วย (Unit Testing)

เมื่อใช้ PostgreSQL เราสามารถใช้ประโยชน์จากฟีเจอร์ของฐานข้อมูล เช่น Stored Procedures หรือ Functions ในการสร้าง Unit ที่สามารถทดสอบได้โดยตรง การทดสอบในระดับหน่วยควรโฟกัสที่ตรรกะทางธุรกิจ (Business Logic) ที่ถูกห่อหุ้มอยู่ในฟังก์ชันเหล่านั้น ไม่ใช่การทดสอบการเชื่อมต่อฐานข้อมูลทั้งหมด

ตัวอย่างเช่น หากเรามีฟังก์ชันที่คำนวณผลรวมจากรายการ ID ที่แยกด้วยเครื่องหมายจุลภาค เราควรทดสอบฟังก์ชันนี้โดยสมมติว่าข้อมูลถูกส่งเข้ามาอย่างถูกต้อง โดยไม่จำเป็นต้องสร้างข้อมูลในตารางจริงทุกครั้ง

ตัวอย่าง PostgreSQL Unit Test

เราจะสร้างฟังก์ชันที่รับรายการ ID เป็นข้อความ และคำนวณผลรวม ซึ่งเป็น Unit Logic ที่เราต้องการทดสอบ:

SQL

-- 1. Setup: สร้างตารางจำลอง (ถ้าจำเป็น) และฟังก์ชันที่ต้องการทดสอบ
CREATE OR REPLACE FUNCTION calculate_sum_from_list(p_list TEXT) RETURNS INT AS $$
DECLARE
    total INT := 0;
    item TEXT;
BEGIN
    -- Logic: แยกสตริงและวนลูปคำนวณผลรวม
    FOREACH item IN ARRAY string_to_array(p_list, ',') LOOP
        total := total + item::INT;
    END LOOP;
    RETURN total;
END; 
$$ LANGUAGE plpgsql;

-- 2. Unit Test Case: ทดสอบฟังก์ชันด้วย Input ที่กำหนด
SELECT calculate_sum_from_list('1,2,3'); -- Expected result: 6

-- 3. Unit Test Case 2: ทดสอบกรณีที่ Input มีค่าเดียว
SELECT calculate_sum_from_list('10'); -- Expected result: 10

การยกระดับสู่ Integration Testing

เมื่อ Unit Test ผ่านแล้ว ขั้นตอนต่อไปคือ Integration Test ซึ่งเป็นการทดสอบว่าฟังก์ชันของเราทำงานร่วมกับส่วนประกอบอื่น ๆ ของ PostgreSQL ได้อย่างถูกต้อง เช่น การทดสอบว่าฟังก์ชันสามารถอ่าน/เขียนข้อมูลลงในตารางจริงได้หรือไม่ หรือการทดสอบ Transaction ที่เกี่ยวข้องกับการอัปเดตหลายตารางพร้อมกัน

บทสรุป

การรวม Clean Architecture เข้ากับ Testing Pyramid ช่วยให้เราสร้างระบบที่ยืดหยุ่นและบำรุงรักษาง่าย การใช้ PostgreSQL ในการสร้าง Unit Test โดยเน้นที่ฟังก์ชันและ Logic ภายในฐานข้อมูล จะช่วยให้ทีมพัฒนาสามารถมั่นใจได้ว่าแกนหลักของแอปพลิเคชันทำงานได้อย่างถูกต้องในทุกระดับการทดสอบ ตั้งแต่ Unit Test ที่รวดเร็ว ไปจนถึง End-to-End Test ที่ครอบคลุมการทำงานทั้งหมด

Exit mobile version