Chúng ta biết docstring cung cấp thông tin thêm về hàm và class trong Python. Chúng ta cũng có thể dùng nó để kiểm thử hàm dùng module doctest. Module doctest thực thi code bắt đầu bằng >>> và so sánh với output kỳ vọng.
Các bước viết hàm với doctest:
- Import module doctest.
- Viết hàm với docstring. Bên trong docstring, viết 2 dòng sau để test hàm:
- >>> function_name(*args).
- Output kỳ vọng.
- Viết code hàm.
- Gọi doctest.testmod(name='function_name', verbose=True) để test. Không thấy kết quả test nếu verbose=False và tất cả test pass. Nên đặt True.
Ví dụ
Viết hàm đơn giản với doctest.
# Import module
import doctest
# Hàm
def numbers_sum(*args) -> int:
"""
Hàm này trả về tổng tất cả tham số
Lệnh shell để test:
>>> numbers_sum(1, 2, 3, 4, 5)
15
>>> numbers_sum(6, 7, 8)
21
"""
return sum(args)
# Gọi testmod
doctest.testmod(name='numbers_sum', verbose=True)
Nếu chạy code trên, kết quả:
Trying: numbers_sum(1, 2, 3, 4, 5) Expecting: 15 ok Trying: numbers_sum(6, 7, 8) Expecting: 21 ok 1 items had no tests: numbers_sum 1 items passed all tests: 2 tests in numbers_sum.numbers_sum 2 tests in 2 items. 2 passed and 0 failed. Test passed. TestResults(failed=0, attempted=2)
Output có từ "ok" sau mỗi test. Nghĩa là output kỳ vọng và thực tế khớp. Kiểm tra kết quả test cuối output.
Ví dụ
Xem điều gì xảy ra khi test fail. Chạy ví dụ tương tự với output sai.
import doctest
def numbers_sum(*args) -> int:
"""
Hàm này trả về tổng tất cả tham số
Lệnh shell để test:
>>> numbers_sum(1, 2, 3, 4, 5)
10
>>> numbers_sum(6, 7, 8)
23
"""
return sum(args)
doctest.testmod(name='numbers_sum', verbose=True)
Kết quả
Thực thi chương trình trên cho kết quả:
Trying: numbers_sum(1, 2, 3, 4, 5) Expecting: 10 ********************************************************************** File "__main__", line 10, in numbers_sum.numbers_sum Failed example: numbers_sum(1, 2, 3, 4, 5) Expected: 10 Got: 15 Trying: numbers_sum(6, 7, 8) Expecting: 23 ********************************************************************** File "__main__", line 12, in numbers_sum.numbers_sum Failed example: numbers_sum(6, 7, 8) Expected: 23 Got: 21 1 items had no tests: numbers_sum ********************************************************************** 1 items had failures: 2 of 2 in numbers_sum.numbers_sum 2 tests in 2 items. 0 passed and 2 failed. ***Test Failed*** 2 failures. TestResults(failed=2, attempted=2)
Kết quả test: 2 failed. Cũng xem được expected và actual output trong output.
Kết luận
Nếu có thắc mắc, hãy đề cập ở phần comment.