การกระจายมาตรฐานของ Python มีโมดูล 'doctest' ฟังก์ชันของโมดูลนี้ทำให้สามารถค้นหาชิ้นส่วนของข้อความที่ดูเหมือนเซสชัน Python แบบโต้ตอบ และรันเซสชันเหล่านี้เพื่อดูว่าทำงานตรงตามที่แสดงหรือไม่ ตัวอย่างเหล่านี้ถูกดึงออกมาจากนิพจน์ docstring ในคลาส, โมดูล หรือฟังก์ชัน Doctests ยังสามารถรันจากไฟล์ข้อความที่มาพร้อมกันได้
ใน Python 'docstring' เป็นสตริงลิเทอรัลที่ปรากฏเป็นนิพจน์แรกในคลาส, ฟังก์ชัน หรือโมดูล มันถูกละเว้นเมื่อสويتถูกรัน แต่ถูกจดจำโดยคอมไพเลอร์และวางไว้ในแอตทริบิวต์ __doc__ ของคลาส, ฟังก์ชัน หรือโมดูลที่ล้อมรอบ
Docstrings มักถูกนำมาใช้เพื่ออธิบายตัวอย่างการใช้งานส่วนต่างๆ ของโค้ด Python โมดูล doctest อนุญาตให้ตรวจสอบว่า docstrings เหล่านี้ทันสมัยกับการแก้ไขรหัสที่เกิดขึ้นเป็นช่วงๆ
ในโค้ดต่อไปนี้ ฟังก์ชันบวก (add) ถูกกำหนดโดยมีตัวอย่างการใช้งาน intercalated ในการตรวจสอบว่าตัวอย่างการใช้งานถูกต้อง ให้เรียกฟังก์ชัน 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 shell ใดๆ
เอาต์พุทที่คาดหวังต้องตามทันทีหลังบรรทัด '>>>' หรือ '...' สุดท้ายที่มีโค้ด และเอาต์พุทที่คาดหวัง (ถ้ามี) ขยายไปถึง '>>>' ถัดไป หรือบรรทัดที่เป็น whitespace ทั้งหมด
เอาต์พุทที่คาดหวังไม่สามารถมีบรรทัด whitespace ทั้งหมดได้ เนื่องจากบรรทัดเช่นนั้นถูกนำมาใช้เพื่อสัญญาณถึงจุดสิ้นสุดของเอาต์พุทที่คาดหวัง หากเอาต์พุทที่คาดหวังมีบรรทัดว่าง ให้ใส่ <BLANKLINE> ในตัวอย่าง doctest ของคุณ ทุกที่ที่คาดหวังบรรทัดว่าง
ในบทความนี้ ฟังก์ชัน testmod() และ testfile() ในโมดูล doctest ได้รับการอภิปราย