การตรวจสอบข้อยกเว้นใน Python โดยใช้ doctest

เมื่อเรากำลังเขียนโค้ดใน Python เรามักต้องการให้แน่ใจว่าฟังก์ชันของเราทำงานตามที่คาดหวังโดยเฉพาะอย่างยิ่งเมื่อพูดถึงการจัดการข้อผิดพลาด หนึ่งในสถานการณ์ที่พบบ่อยคือการทดสอบว่าฟังก์ชันจะเกิดข้อยกเว้นภายใต้เงื่อนไขบางอย่างหรือไม่ หากคุณกำลังใช้โมดูล doctest ของ Python ในการทดสอบ คุณอาจสงสัยว่า: ฉันสามารถตรวจสอบได้หรือไม่ว่ามีข้อยกเว้นเกิดขึ้นด้วย doctest? คำตอบคือใช่! มาลองสำรวจวิธีการใช้ doctest เพื่อยืนยันข้อยกเว้นในฟังก์ชัน Python ของคุณกัน

ปัญหา: การทดสอบข้อยกเว้น

ลองพิจารณาฟังก์ชันที่เรียกว่า foo(x) ฟังก์ชันนี้ถูกออกแบบให้เกิดข้อยกเว้นหากอาร์กิวเมนต์ของมันน้อยกว่าเป็นศูนย์ คำถามหลักที่นี่คือจะเขียน doctest อย่างไรเพื่อยืนยันว่าฟังก์ชันทำงานได้ถูกต้องในสถานการณ์นี้ โดยเฉพาะเมื่อเราป้อนค่าที่น้อยกว่าศูนย์ เราต้องการให้แน่ใจว่ามีข้อยกเว้นเกิดขึ้นเพื่อระบุว่ามีบางอย่างผิดพลาด

ตัวอย่างฟังก์ชัน

นี่คือเวอร์ชันง่ายของฟังก์ชัน foo(x):

def foo(x):
    if x < 0:
        raise ValueError("x ต้องไม่เป็นลบ")
    return x

ทางแก้: การเขียน doctest

ในการสร้าง doctest ที่ตรวจสอบข้อยกเว้น เราจะใช้แนวทางต่อไปนี้ ใน doctest ของเรา เราสามารถระบุว่าเราคาดหวังให้เกิดข้อยกเว้นเมื่อเรียกใช้ foo() ด้วยค่าที่ควรกระตุ้นให้เกิดข้อผิดพลาด นี่คือวิธีการทำทีละขั้นตอน:

ขั้นตอนที่ 1: เขียน Doctest

ใน docstring ของฟังก์ชันของคุณ คุณสามารถเพิ่มกรณีทดสอบที่แสดงข้อยกเว้นที่คาดหวังได้ นี่คือรูปลักษณ์:

def foo(x):
    """
    คืนค่า x หากมันไม่เป็นลบ
    
    Raises:
        ValueError: หาก x < 0.
    
    ตัวอย่าง:
    >>> foo(-1)
    Traceback (most recent call last):
      ...
    ValueError: x ต้องไม่เป็นลบ
    >>> foo(3)
    3
    """
    if x < 0:
        raise ValueError("x ต้องไม่เป็นลบ")
    return x

ขั้นตอนที่ 2: รัน Doctest

เพื่อรัน doctest ให้รวมส่วนย่อยด้านล่างนี้ที่ส่วนท้ายของสคริปต์ Python ของคุณ:

if __name__ == "__main__":
    import doctest
    doctest.testmod()

ขั้นตอนที่ 3: ผลลัพธ์ที่คาดหวัง

เมื่อคุณรันสคริปต์ doctest จะประมวลผลตัวอย่างใน docstring หากทุกอย่างทำงานได้ถูกต้อง คุณจะไม่เห็นการแสดงผล (บ่งชี้ว่าทดสอบทั้งหมดผ่าน) หากข้อยกเว้นไม่ถูกกระตุ้นตามที่คาดไว้ doctest จะรายงานข้อผิดพลาด

แหล่งข้อมูลเพิ่มเติม

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการใช้ doctest ในโมดูลของคุณอย่างมีประสิทธิภาพ โปรดดูที่ เอกสารของโมดูล doctest อย่างเป็นทางการ

บทสรุป

การใช้ doctest เพื่อตรวจสอบให้แน่ใจว่ามีการเกิดข้อยกเว้นอย่างถูกต้องไม่ใช่เพียงแค่เป็นไปได้; มันตรงไปตรงมา! โดยการเพิ่มบรรทัดไม่กี่บรรทัดใน docstring ของฟังก์ชันของคุณ คุณสามารถบันทึกและทดสอบพฤติกรรมของโค้ดของคุณได้อย่างมีประสิทธิภาพ ทำให้แน่ใจว่ามันเป็นไปตามรูปแบบที่คาดหวัง ไม่ว่าคุณจะเขียนฟังก์ชันใหม่หรือทดสอบฟังก์ชันที่มีอยู่แล้ว doctest เป็นเครื่องมือที่ทรงพลังในการรวมการทดสอบที่ขับเคลื่อนด้วยตัวอย่างไว้โดยตรงเคียงข้างโค้ดของคุณ สนุกกับการทำให้โค้ดของคุณแข็งแกร่ง และแฮปปี้โค้ดดิ้ง!