การตรวจสอบข้อยกเว้นใน 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
เป็นเครื่องมือที่ทรงพลังในการรวมการทดสอบที่ขับเคลื่อนด้วยตัวอย่างไว้โดยตรงเคียงข้างโค้ดของคุณ สนุกกับการทำให้โค้ดของคุณแข็งแกร่ง และแฮปปี้โค้ดดิ้ง!