Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ทดสอบตัวอย่าง Python แบบโต้ตอบ (doctest)

การกระจายมาตรฐานของ 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 ได้รับการอภิปราย