การกระจายมาตรฐานของ Python มีโมดูล 'doctest' ฟังก์ชันการทำงานของโมดูลนี้ทำให้สามารถค้นหาชิ้นส่วนของข้อความที่ดูเหมือนเซสชัน Python แบบโต้ตอบและดำเนินการเซสชันเหล่านี้เพื่อดูว่าทำงานตรงตามที่แสดงหรือไม่ ตัวอย่างเหล่านี้ดึงมาจากนิพจน์ docstring ในคลาส โมดูล หรือฟังก์ชัน นอกจากนี้ยังสามารถเรียกใช้ Doctests จากไฟล์ข้อความจากไฟล์ข้อความที่มาพร้อมกับเครื่องได้
ใน Python 'docstring' คือตัวอักษรสตริงซึ่งปรากฏเป็นนิพจน์แรกในคลาส ฟังก์ชัน หรือโมดูล มันถูกละเว้นเมื่อดำเนินการชุด แต่คอมไพเลอร์รู้จักและใส่ลงในแอตทริบิวต์ __doc__ ของคลาสที่ล้อมรอบ ฟังก์ชัน หรือโมดูล
docstrings มักใช้เพื่ออธิบายตัวอย่างการใช้งานส่วนต่างๆ ของโค้ด Python โมดูล doctest ช่วยให้ตรวจสอบได้ว่าเอกสารเหล่านี้มีการแก้ไขเป็นช่วงๆ ในโค้ดหรือไม่
ในโค้ดต่อไปนี้ ฟังก์ชันแฟกทอเรียลถูกกำหนดไว้พร้อมตัวอย่างการใช้งาน เพื่อตรวจสอบว่าตัวอย่างการใช้งานถูกต้องหรือไม่ ให้เรียกใช้ฟังก์ชัน testmod() ในโมดูล doctest
def add(a,b): ''' >>> add(10,20) 30 >>> add('aaa','bbb') 'aaabbb' >>> add('aaa',20) Traceback (most recent call last): ... TypeError: must be str, not int ''' return a+b
ขั้นแรกให้ป้อนและบันทึกสคริปต์ด้านบนเป็น mytest.py แล้วลองเรียกใช้สคริปต์นี้จากบรรทัดคำสั่ง
Python mytest.py
จะไม่มีการแสดงผลลัพธ์เว้นแต่ตัวอย่างจะล้มเหลว ตอนนี้เปลี่ยนบรรทัดคำสั่งเป็น
Python mytest.py –v
ตอนนี้คอนโซลจะแสดงผลลัพธ์ต่อไปนี้ -
F:\Python36>python mytest.py -v Trying: add(10,20) Expecting: 30 ok Trying: add('aaa','bbb') Expecting: 'aaabbb' ok Trying: add('aaa',20) Expecting: Traceback (most recent call last): ... TypeError: must be str, not int ok 1 items had no tests: __main__ 1 items passed all tests: 3 tests in __main__.add 3 tests in 2 items. 3 passed and 0 failed. Test passed.
การตรวจสอบตัวอย่างในไฟล์ข้อความ
การประยุกต์ใช้ doctest อย่างง่ายอีกอย่างหนึ่งคือการทดสอบตัวอย่างแบบโต้ตอบในไฟล์ข้อความ สามารถทำได้ด้วยฟังก์ชัน testfile()
ข้อความต่อไปนี้ถูกเก็บไว้ในไฟล์ข้อความชื่อ 'example.txt'
Using ''add'' ------------------- This is an example text file . First import ''add'' from the ''mytest'' module: >>> from mytest import add >>> add(10,20) 30
เนื้อหาไฟล์ถือเป็น docstring ในการตรวจสอบตัวอย่างในไฟล์ข้อความให้ใช้ฟังก์ชัน testfile() ของโมดูล doctest
def add(a,b): return a+b if __name__ == "__main__": import doctest doctest.testfile("example.txt")
-
เช่นเดียวกับ testmod() testfile() จะไม่แสดงอะไรเลยเว้นแต่ตัวอย่างจะล้มเหลว หากตัวอย่างล้มเหลว ตัวอย่างที่ล้มเหลวและสาเหตุของความล้มเหลวจะถูกพิมพ์ไปยังคอนโซล โดยใช้รูปแบบเดียวกับ testmod()
-
ในกรณีส่วนใหญ่ การคัดลอกแล้ววางของเซสชันคอนโซลแบบโต้ตอบจะทำงานได้ดี แต่ doctest ไม่ได้พยายามจำลองเชลล์ Python ใดโดยเฉพาะ
-
ผลลัพธ์ที่คาดหวังใดๆ จะต้องต่อจากบรรทัด '>>>' หรือ '...' สุดท้ายที่มีโค้ด และผลลัพธ์ที่คาดหวัง (ถ้ามี) จะขยายไปยัง '>>>' หรือบรรทัดเว้นวรรคทั้งหมด
-
เอาต์พุตที่คาดหวังต้องไม่มีบรรทัดเว้นวรรคทั้งหมด เนื่องจากบรรทัดดังกล่าวถูกใช้เพื่อส่งสัญญาณการสิ้นสุดของเอาต์พุตที่คาดไว้ หากผลลัพธ์ที่คาดไว้มีบรรทัดว่าง ให้ใส่
ในตัวอย่าง doctest ของคุณแต่ละที่ที่คาดว่าจะมีบรรทัดว่าง
ในบทความนี้ได้มีการกล่าวถึงฟังก์ชั่น testmod() และ testfile() ในโมดูล doctest