Notes & software courses · Free to learn
Aph's Blog
On this page

เริ่มต้นกับ pytest

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

เขียนและรันเทสต์อัตโนมัติด้วย pytest — เครื่องมือเทสต์ที่นิยมที่สุดใน Python

pytest คือ framework เทสต์ที่ใช้กันมากที่สุดใน Python จุดเด่นคือเขียนง่าย ใช้ assert ธรรมดา ไม่ต้องจำ method แปลก ๆ หัวข้อนี้พาเขียนเทสต์แรกและรันให้เป็น

ติดตั้งและกฎการตั้งชื่อ

bash
pip install pytest

pytest หาเทสต์อัตโนมัติจากชื่อ: ไฟล์ขึ้นต้น test_ หรือลงท้าย _test และฟังก์ชันขึ้นต้น test_

python
# ไฟล์ mathutils.py
def add(a, b):
    return a + b

def divide(a, b):
    return a / b
python
# ไฟล์ test_mathutils.py
from mathutils import add, divide

def test_add():
    assert add(2, 3) == 5

def test_add_negative():
    assert add(-1, -1) == -2

def test_divide():
    assert divide(10, 2) == 5.0

รันเทสต์

bash
pytest                  # รันทุกเทสต์ในโปรเจกต์
pytest test_mathutils.py   # รันไฟล์เดียว
pytest -v               # แสดงรายละเอียดแต่ละเทสต์
pytest -k add           # รันเฉพาะเทสต์ที่ชื่อมี 'add'
test_mathutils.py ...                    [100%]
3 passed in 0.01s

# ถ้าพัง pytest บอกชัดว่าเคสไหน บรรทัดไหน ค่าที่ได้ vs ที่คาด
# assert add(2, 3) == 6
# E  assert 5 == 6
pytest ใช้ assert ธรรมดา

ต่างจาก framework อื่น (เช่น unittest ที่ต้องใช้ self.assertEqual) pytest ใช้ assert ของ Python ตรง ๆ แล้วมันฉลาดพอจะบอกค่าที่ได้กับค่าที่คาดให้เห็นเมื่อพัง — เขียนง่าย อ่านง่าย

จัดโครงสร้างเทสต์

นิยมแยกเทสต์ไว้โฟลเดอร์ tests/ (จากบทโครงสร้างโปรเจกต์) แต่ละไฟล์ test_ ทดสอบ module ที่คู่กัน

my-project/
├── src/myapp/mathutils.py
└── tests/test_mathutils.py

สรุปหัวข้อนี้

  • pip install pytest; ตั้งชื่อไฟล์ test_*.py ฟังก์ชัน test_*
  • ใช้ assert ธรรมดา — pytest บอกค่าที่ได้ vs คาดเมื่อพัง
  • รันด้วย pytest, -v ละเอียด, -k กรองชื่อ
  • แยกเทสต์ไว้ tests/ ทดสอบแต่ละ module
แบบฝึกหัด

1) เขียนฟังก์ชัน + ไฟล์ test_ แล้วรัน pytest ให้ผ่าน 2) เขียนเทสต์ 3 เคส: ปกติ / ขอบ (เช่น 0) / กรณีพิเศษ 3) จงใจทำเทสต์พังแล้วอ่านข้อความ pytest 4) ลอง pytest -v และ -k