PlusMagi's Blog By Pitt Phunsanit Programming,Python,technology,Testing Unit Testing Frameworks: การเขียน Unit Test และ Mocking ด้วย PyTest และ unittest.mock สำหรับ Python

Unit Testing Frameworks: การเขียน Unit Test และ Mocking ด้วย PyTest และ unittest.mock สำหรับ Python

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


เจาะลึกรายละเอียดและประเด็นสำคัญ

หัวใจของการพัฒนาที่ยั่งยืนคือการทำ Unit Testing ซึ่งหมายถึงการทดสอบส่วนประกอบ (Component) ที่เล็กที่สุดของโค้ดอย่างโดดเดี่ยว เพื่อให้แน่ใจว่าฟังก์ชันหรือคลาสที่เราเขียนขึ้นมานั้นทำงานได้ตามที่คาดหวังจริง ๆ ใน Python เรามีเครื่องมือทรงพลังอย่าง PyTest และ unittest ให้เลือกใช้ โดย PyTest ได้รับความนิยมสูงเนื่องจากใช้งานง่ายและมีความสามารถในการค้นหา Test Case ที่ยอดเยี่ยม

อย่างไรก็ตาม ปัญหาที่มักพบคือการพึ่งพาภายนอก (External Dependencies) เช่น การเรียกฐานข้อมูลจริง หรือ API ภายนอก ซึ่งทำให้ Unit Test ของเราช้าและไม่เสถียร ในจุดนี้เองที่เราต้องใช้เทคนิค Mocking โดยอาศัยไลบรารี unittest.mock เพื่อจำลองการทำงานของส่วนประกอบเหล่านั้น ทำให้เราสามารถทดสอบ Logic ภายในของเราได้อย่างสมบูรณ์แบบโดยไม่ต้องพึ่งพาโลกภายนอกจริง ๆ

import unittest.mock as mock
from my_module import get_user_data # สมมติว่ามีฟังก์ชันนี้ที่เรียก API

def test_get_user_data_success():
    # ใช้ Mock เพื่อจำลองการตอบกลับของ API ภายนอก
    with mock.patch('my_module.requests') as mock_requests:
        mock_requests.return_value.json.return_value = {"id": 1, "name": "John Doe"}
        
        # เรียกฟังก์ชันที่ต้องการทดสอบ
        result = get_user_data(user_id=1)
        
        # Assert ว่าผลลัพธ์ถูกต้อง และมีการเรียก API อย่างเหมาะสม
        assert result['name'] == "John Doe"

test_get_user_data_failure():
    with mock.patch('my_module.requests') as mock_requests:
        mock_requests.return_value.json.side_effect = Exception("API Down")
        
        # ทดสอบกรณีที่ API ล้มเหลว
        try:
            get_user_data(user_id=99)
        except Exception as e:
            assert "API Down" in str(e)

<!-- /wp-block-syntaxhighlighter/code -->


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">การนำไปประยุกต์ใช้ในชีวิตและการทำงานยุคใหม่</h2>



<ul class="wp-block-list">
<li><strong style="font-weight: 700;">การสร้างความมั่นใจในระบบ (System Reliability):</strong> การเขียน Unit Test อย่างสม่ำเสมอเปรียบเสมือนการมีตาข่ายนิรภัยให้กับโค้ดของเรา ทำให้เรากล้าที่จะ Refactor หรือเพิ่มฟีเจอร์ใหม่ ๆ ได้อย่างเต็มที่ โดยไม่ต้องกังวลว่าจะทำลายส่วนอื่นของระบบ</li>


<li><strong style="font-weight: 700;">การทำงานร่วมกันในทีม (Team Collaboration):</strong> Test Code ที่ดีจะกลายเป็นเอกสารประกอบที่ชัดเจนที่สุดชุดหนึ่ง มันแสดงให้เห็นว่าโค้ดส่วนนี้ควรมีพฤติกรรมอย่างไรภายใต้ทุกสถานการณ์ ทั้งกรณีปกติและกรณีผิดพลาด</li>
</ul>


<p class="wp-block-paragraph">การเชี่ยวชาญในการทำ Unit Test และ Mocking ไม่ใช่แค่ทักษะทางเทคนิค แต่เป็นเครื่องบ่งชี้ถึงความเป็นวิศวกรซอฟต์แวร์ที่มีความรับผิดชอบสูง (Responsible Developer) เพราะมันช่วยลดภาระงานในการ Debug ในระยะยาว ทำให้วงจรการพัฒนาสั้นลง และส่งผลให้องค์กรสามารถส่งมอบผลิตภัณฑ์ที่เสถียรและมีคุณภาพได้อย่างต่อเนื่อง</p>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">อ่านเพิ่มเติม</p>



<ul class="wp-block-list">

<li><a href="https://pitt.plusmagi.com/linux-%e0%b8%95%e0%b8%a3%e0%b8%a7%e0%b8%88%e0%b8%aa%e0%b8%ad%e0%b8%9a%e0%b8%84%e0%b8%a7%e0%b8%b2%e0%b8%a1%e0%b8%96%e0%b8%81%e0%b8%95%e0%b8%ad%e0%b8%87%e0%b8%82%e0%b8%ad%e0%b8%87%e0%b8%a3%e0%b8%b0/" data-type="post" data-id="429">Linux: ตรวจสอบความถูกต้องของระบบด้วยสปีดขั้นสุด 🚀</a></li>


<li><a href="https://pitt.plusmagi.com/tarball-%e0%b9%80%e0%b8%9b%e0%b9%87%e0%b8%99-version-control/" data-type="post" data-id="11304">Tarball: เป็น version control ?</a></li>


<li><a href="https://pitt.plusmagi.com/473-2/" data-type="post" data-id="473">SecDevOps: เปลี่ยนความปลอดภัยให้เป็นเนื้อเดียวกับ Code และ Operation</a></li>

</ul>
Exit mobile version