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

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


การกระจายมาตรฐานของ 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