สวัสดีเหล่า Developer วัยรุ่นไฟแรง! เคยใจหายแว๊บกันไหมครับ? หลังจากที่ deploy ฟีเจอร์ใหม่ขึ้น Production ไปแล้ว ลูกค้าตัวจริงกลับโทรมาแจ้งว่า “ระบบใช้งานไม่ได้ค่ะ” 😱 เหงื่อแตกพลั่กทันที. เราต้องรีบหาต้นตอของปัญหาให้เจอทันที. ทุกนาทีที่ผ่านไปคือความเสียหายทางธุรกิจ.
อาการเหล่านี้แหละครับ คือสัญญาณว่าเราขาด “เกราะป้องกัน” ที่ดีให้กับซอฟต์แวร์ของเรา และเกราะที่ว่านั่นก็คือ การทดสอบซอฟต์แวร์ (Software Testing) นั่นเอง
บทความนี้คือตอนแรกของซีรีส์ “วัยรุ่นเทสดี” ที่จะพาทุกคนไปเปลี่ยนจากคนเขียนโค้ดธรรมดา ให้กลายเป็น Developer สุดเท่ที่ส่งมอบงานคุณภาพ พร้อมเกราะป้องกันบั๊กเต็มพิกัด!
ทำไมต้องทำเทส? มันสำคัญยังไง?
หลายคนอาจจะคิดว่า “ทำไมต้องเสียเวลาทำเทสด้วย ในเมื่อโค้ดมันก็ทำงานได้อยู่แล้ว” แต่จริงๆ แล้ว การทำเทสมีประโยชน์มากกว่าที่คิด
การทำเทสไม่ใช่แค่การหาบั๊ก แต่ยังช่วยให้เรา:
- มั่นใจในคุณภาพ – ทำให้เรามั่นใจว่าโค้ดที่เขียนขึ้นมานั้นทำงานได้ตามที่คาดหวัง และไม่มีผลกระทบต่อฟีเจอร์อื่นๆ
- ลดความเสี่ยง – การทำเทสช่วยลดความเสี่ยงในการ deploy ฟีเจอร์ใหม่ๆ เพราะเราสามารถตรวจสอบได้ว่าโค้ดที่เขียนขึ้นมานั้นทำงานได้ตามที่คาดหวัง และไม่มีผลกระทบต่อฟีเจอร์อื่นๆ
- เพิ่มความมั่นใจในการ Refactor – เมื่อเราต้องปรับปรุงโค้ด การมีเทสที่ครอบคลุมจะช่วยให้เรามั่นใจว่าโค้ดยังทำงานได้ถูกต้องหลังจากการเปลี่ยนแปลง
- เป็นเอกสารประกอบโค้ด – เทสที่ดีจะอธิบายได้ว่าโค้ดควรทำงานยังไง รับค่าอะไรเข้ามา แล้วต้องคืนค่าอะไรกลับไป มันคือเอกสารประกอบโค้ดที่ดีที่สุดเลยล่ะ
- ช่วยในการสื่อสาร – เทสที่เขียนดีจะช่วยให้ทีมงานเข้าใจโค้ดได้ง่ายขึ้น และช่วยให้การสื่อสารระหว่างทีมพัฒนากับ QA หรือ Product Owner เป็นไปอย่างราบรื่น
การทำเทสจึงไม่ใช่ภาระ แต่เป็นการลงทุนเพื่อ ความมั่นใจในคุณภาพ ของโค้ดที่เราเขียนขึ้นมาเองกับมือ
แนะนำให้รู้จักกับ pytest

ในโลกของ Python มีเครื่องมือสำหรับเขียนเทสอยู่หลายตัว แต่ตัวที่โดดเด่น เป็นที่นิยม และใช้ง่ายเหมือนปอกกล้วยเข้าปากก็คือ pytest นั่นเอง
ทำไมต้อง pytest?
โค้ดสั้นกระชับ – ใช้แค่คำสั่ง assert ธรรมดาๆ ของ Python ก็เทสได้แล้ว ไม่ต้องจำ method ชื่อยาวๆ แบบ assertEqual, assertTrue ให้วุ่นวาย
อ่านผลเทสง่ายมาก – ตอนเทสพัง pytest จะบอกละเอียดเลยว่าค่าที่คาดหวัง (Expected) คืออะไร แล้วค่าที่ได้จริงๆ (Actual) คืออะไร ทำให้ดีบั๊กง่ายสุดๆ
ทรงพลังและขยายร่างได้ – มีของเล่น (Plugins) ให้ใช้เยอะมาก ตั้งแต่การทำ Mocking, การวัด Coverage ไปจนถึงการรันเทสแบบขนาน เพิ่มความเร็วในการเทส
Fixtures สุดเจ๋ง – (อันนี้ของเด็ด เดี๋ยวตอนต่อๆ ไปจะเล่าให้ฟัง) เป็นวิธีเตรียมข้อมูลหรือ Environment สำหรับเทสที่ทรงพลังและทำให้โค้ดเทสเราสะอาดขึ้นมาก
เอาล่ะ พูดมาเยอะแล้ว ลงมือกันเลยดีกว่า!
ลงมือทำ First Test กับ pytest
มาลองเขียนเทสแรกของเรากันเลยดีกว่า รับรองว่าง่ายกว่าที่คิด
เตรียม Environment ให้พร้อม
ก่อนจะเริ่มเขียนเทส เราต้องเตรียมสภาพแวดล้อมให้พร้อมก่อน ตั้งแต่การติดตั้ง Python ไปจนถึงการใช้ VS Code
ติดตั้ง Python
ถ้ายังไม่มี Python ในเครื่อง ให้ไปดาวน์โหลดจาก python.org เลือกเวอร์ชันล่าสุด (แนะนำ 3.8 ขึ้นไป)
ตรวจสอบว่าติดตั้งสำเร็จแล้วโดยเปิด Command Prompt แล้วพิมพ์:
python --version
ถ้าเห็นเวอร์ชัน Python แสดงว่าเรียบร้อยแล้ว
ติดตั้งและตั้งค่า Visual Studio Code
ดาวน์โหลด VS Code จาก code.visualstudio.com
เปิด VS Code ขึ้นมาแล้วติดตั้ง Extension สำคัญๆ
Python (โดย Microsoft) – สำหรับเขียน Python

Python Test Explorer – เพื่อรัน pytest ผ่าน GUI

Python Indent – จัดการ indentation ให้สวยงาม

เปิด project ใน VS Code
เปิด PowerShell ขึ้นมา
# 1. สร้างโฟลเดอร์สำหรับ project
mkdir wai_roon_test_dee
# 2. เข้าไปยังโฟลเดอร์ project ที่สร้างขึ้น
cd wai_roon_test_dee
# 3. เปิด VS Code ในโฟลเดอร์นี้
code .
ตอนนี้เราก็จะได้ project เปล่าๆขึ้นมาเเล้ว

สร้าง Virtual Environment (ขั้นตอนสำคัญ!)
Virtual Environment เป็นสิ่งสำคัญมาก เหมือนกับการสร้าง “ห้องแยก” สำหรับโปรเจกต์แต่ละตัว เพื่อไม่ให้ package ปะปนกัน
เปิด terminal ของ VSCode ขึ้นมา ไปที่ menu Terminal ที่ menu bar ด้านบน → New Terminal
สร้าง Virtual Environment
python -m venv .venv

virtual environment ถูกสร้างขึ้นมาเรียบร้อยเเล้ว
เปิดใช้งาน Virtual Environment บน Windows
.\.venv\Scripts\activate
เมื่อ activate สำเร็จจะเห็น (.venv) ปรากฏหน้าชื่อ path ใน Command Prompt
ติดตั้ง pytest ใน Virtual Environment
ตอนนี้ให้ติดตั้ง pytest ใน virtual environment ที่เราเพิ่งสร้าง:
pip install pytest
ตรวจสอบว่าติดตั้งสำเร็จหรือไม่โดยการดูว่า pytest version อะไรที่ถูกติดตั้ง
pytest --version
pytest 8.4.1
ใน VS Code ให้กด Ctrl+Shift+P แล้วพิมพ์ “Python: Select Interpreter” เลือก interpreter ที่อยู่ในโฟลเดอร์ .venv ที่เราสร้างไว้
สร้างไฟล์และโฟลเดอร์สำหรับโปรเจกต์
ตอนนี้เราจะสร้างโครงสร้างไฟล์สำหรับโปรเจกต์เครื่องคิดเลขของเรา ใน VSCode ให้สร้างไฟล์และโฟลเดอร์ตามโครงสร้างนี้:
wai_roon_test_dee/
├── src/
| └── calculator.py
├── tests/
| └── test_calculator.py
└── conftest.py
อธิบายโครงสร้าง:
srcโฟลเดอร์สำหรับเก็บโค้ดโปรแกรมหลักของเราtests/โฟลเดอร์สำหรับเก็บไฟล์เทสทั้งหมดtest_calculator.pyไฟล์เทสสำหรับ calculator (สังเกตการตั้งชื่อtest_นำหน้า)conftest.pyไฟล์สำหรับกำหนด fixtures หรือการตั้งค่าทั่วไปสำหรับเทส (เราจะใช้ในตอนต่อไป)
หลังจากสร้าง folder สำหรับ project เรียบร้อยเเล้ว เรามาเริ่มเขียนโค้ดกันได้เลย
เขียนโค้ดที่โปรแกรมหลัก
ในไฟล์ calculator.py ใส่ฟังก์ชันบวกเลขง่ายๆ เข้าไป
# src/calculator.py
def add(x, y):
return x + y
def subtract(x, y):
return x - y
เขียนเทสแรกของเรา!
ตอนนี้มาถึงส่วนสำคัญของการทดสอบการทำงานของโค้ดที่เราเขียนพึ่งเขียนไปใน calculator.py
ให้เราเขียนโค้ดเทสสำหรับฟังก์ชัน add ของเรา ในไฟล์ tests/test_calculator.py
🔍 กฎการตั้งชื่อสำหรับ pytest (สำคัญมาก!)
ก่อนเขียนโค้ด มาทำความเข้าใจกฎการตั้งชื่อของ pytest กันก่อน:
การตั้งชื่อไฟล์เทส:
- ต้องขึ้นต้นด้วย
test_หรือลงท้ายด้วย_test.py - ✅ ถูกต้อง:
test_calculator.py,test_user.py,calculator_test.py - ❌ ผิด:
my_tests.py,testing_calculator.py
การตั้งชื่อฟังก์ชันเทส:
- ต้องขึ้นต้นด้วย
test_ - ใช้ชื่อที่บอกว่าเทสอะไร เป็น snake_case
- ✅ ถูกต้อง:
test_add_positive_numbers(),test_divide_by_zero() - ❌ ผิด:
add_test(),testAdd(),check_addition()
การตั้งชื่อคลาสเทส (ถ้าใช้):
- ต้องขึ้นต้นด้วย
Test - ✅ ถูกต้อง:
TestCalculator,TestUserLogin - ❌ ผิด:
CalculatorTest,Calculator_Test
ทำไมต้องเป็นแบบนี้? pytest ใช้ระบบ auto-discovery หมายความว่ามันจะไปหาไฟล์และฟังก์ชันที่ตั้งชื่อตามกฎเหล่านี้โดยอัตโนมัติ ถ้าตั้งชื่อผิด pytest จะไม่เห็นเทสของเรา!
ตอนนี้มาเขียนโค้ดเทสกันเลย 🚀
# tests/test_calculator.py
# อย่าลืม import ฟังก์ชันที่เราจะเทสเข้ามาด้วย
from src.calculator import add, subtract
# เทสฟังก์ชันบวกเลข
def test_add_positive_numbers():
# เทสการบวกเลขบวกสองตัว สังเกตการตั้งชื่อ: test_ + สิ่งที่เทส + สถานการณ์
# ยืนยันว่า ผลลัพธ์ของการเรียก add(1, 2) ต้องเท่ากับ 3
assert add(1, 2) == 3
def test_add_negative_numbers():
# เทสการบวกเลขลบสองตัว ชื่อฟังก์ชันบอกได้ชัดเจนว่าเทสอะไร
# ยืนยันว่า ผลลัพธ์ของการเรียก add(-1, -1) ต้องเท่ากับ -2
assert add(-1, -1) == -2
def test_add_mixed_numbers():
# เทสการบวกเลขบวกกับเลขลบ เพิ่มเทสเคสเพื่อให้ครอบคลุมมากขึ้น
assert add(5, -3) == 2
assert add(-10, 15) == 5
# เทสฟังก์ชันลบเลข
def test_subtract_positive_numbers():
assert subtract(5, 2) == 3
def test_subtract_negative_numbers():
assert subtract(-5, -2) == -3
def test_subtract_mixed_numbers():
assert subtract(-5, 2) == -7
assert subtract(5, -2) == 7
โค้ดเทสของเราก็คือฟังก์ชัน Python ธรรมดาๆ ที่ขึ้นต้นด้วย test_ และข้างในเราใช้ assert เพื่อ “ยืนยัน” ว่าสิ่งที่คาดหวังนั้นเป็นจริง
รันเทสใน VS Code
VS Code มีวิธีรันเทสที่สะดวกหลายแบบ
วิธีที่ 1: ใช้ Terminal ใน VS Code
กด Ctrl+Shift+` เพื่อเปิด Terminal ใน VS Code แล้วรันคำสั่ง
pytest -v
ถ้าทุกอย่างถูกต้อง เราจะเห็นผลลัพธ์แบบนี้

วิธีที่ 2: ใช้ Test Explorer (แนะนำ!)
- เลือกเมนู Testing ที่ ด้านซ้ายของ VS Code

2. เลือก “Configure Python Tests”

3. เลือก framework “pytest”

4. เลือกโฟลเดอร์ “tests”

5. VS Code จะแสดง Test Explorer ที่ sidebar ซ้ายมือ

6. คลิกปุ่ม ▶️ เพื่อรันเทสทั้งหมด

ถ้าทุกอย่างถูกต้อง เราจะเห็นผลลัพธ์สีเขียวๆ สบายตาแบบนี้:

เทส ผ่าน ทั้งหมด! สุดยอดไปเลย!
เทสที่ไม่ผ่าน จะแสดงผลอย่างไร?
การเห็นเทสพังก็สำคัญไม่แพ้กัน ลองกลับไปแก้ไฟล์ test_calculator.py ให้ผิดดูสักเทส
# tests/test_calculator.py
def test_add_negative_numbers():
# ตั้งใจทำให้ผิด assert add(-1, -1) ควรจะได้ -2 แต่เราจะเช็คกับ 0
assert add(-1, -1) == 0
แล้วรัน pytest อีกครั้ง…
คราวนี้เราจะเห็นผลลัพธ์สีแดงๆ พร้อมคำอธิบายที่ชัดเจนมาก

pytest บอกเราเป๊ะๆ เลยว่า AssertionError เกิดขึ้นที่ไฟล์ไหน ฟังก์ชันไหน บรรทัดไหน และที่เจ๋งที่สุดคือมันบอกว่า assert -2 == 0 นั้นเป็นเท็จ… โคตรชัด!
ถ้าใช้ Test Explorer ก็จะเห็นผลลัพธ์สีแดงๆ พร้อมข้อความอธิบายที่ชัดเจนใน UI ด้วย

ยินดีด้วย! คุณได้เขียนและรันเทสแรกด้วย pytest สำเร็จแล้ว วันนี้เราได้เรียนรู้ว่า:
- การเทสไม่ใช่เรื่องน่าเบื่อ แต่เป็นหัวใจของซอฟต์แวร์คุณภาพดี
- pytest คือเครื่องมือที่ช่วยให้การเทสเป็นเรื่องง่ายและมีประสิทธิภาพ
- เราสามารถเขียนและรันเทสเบื้องต้น รวมถึงอ่านผลลัพธ์ทั้งตอนที่ผ่านและไม่ผ่านได้
ในตอนหน้า… เราจะมาลงลึกกันอีกหน่อย จะพาไปดูว่า assert ทำอะไรได้มากกว่าแค่ == และจะจัดการกับโค้ดเทสที่เริ่มเยอะขึ้นยังไงให้ยังคงความคลีนอยู่เสมอ
ติดตาม Part 2: เข้าใจ Assertions และการจัดระเบียบเทสอย่างโปรฯ กันได้เลย

Leave a Reply